测试Type是否为集合的最佳方法

Max*_*oro 6 .net c# ienumerable

我有一个方法接受System.Object类型的参数obj

现在我想检查一下obj的实际类型是:

  • 集合类型(IEnumerable).
  • 还要别的吗.

我想到的第一种方式是:

if (obj is IEnumerable) 
   // obj is a collection
Run Code Online (Sandbox Code Playgroud)

但System.String实现IEnumerable,我不想将字符串视为集合.

我认为第二种方法是测试ICollection而不是IEnumerable,因为IEnumerable更像是一个潜在的集合而不是实际的集合.这将省去字符串,但也会遗漏ICollection-Of-T,因为它不继承ICollection(IEnumerable-Of-T是唯一的向后兼容的通用集合抽象 - 它继承了IEnumerable).

所以我想最好的方法是:

if (obj is string) 
  // not a collection
else if (obj is IEnumerable) 
  // collection
else
  // not a collection
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Jar*_*Par 7

我觉得你有点过于复杂了.如果你真的想使用IEnumerable但排除System.String,为什么不直接在代码中这样做呢?

public static bool IsCollection(object obj) {
  return obj is IEnumerable && !(obj is String);
}
Run Code Online (Sandbox Code Playgroud)


Pav*_*aev 5

如果你真的只想测试:

bool isCollection = obj.GetType().GetInterfaces()
    .Any(iface => iface.GetGenericTypeDefinition() == typeof(ICollection<>))
Run Code Online (Sandbox Code Playgroud)

但坦率地说,如果你真的只想要特殊情况string(为什么,顺便说一下?),那就这样做吧.如果你测试ICollection<>,你会将LINQ查询的结果视为"非集合",例如,没有充分的理由.