【问题标题】:Best way to test if a Type is a collection测试类型是否为集合的最佳方法
【发布时间】:2010-11-13 22:01:53
【问题描述】:

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

现在我想检查 obj 的实际类型是否为:

  • 集合类型 (IEnumerable)。
  • 其他的。

我想到的第一个办法是:

if (obj is IEnumerable) 
   // obj is a collection

但是 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

有没有更好的办法?

【问题讨论】:

  • 我将枚举视为序列,而不是集合。那里的含义可能存在细微差别;因为我不知道你的应用程序,所以我不知道这是否相关。我们在设计集合初始化器时遇到了这个问题。有很多“集合”没有实现 ICollection,并且有很多实现 Add 的对象不是集合。 (通常是数学对象。)我们决定使用启发式方法。如果一个类型既实现了 IEnumerable 又具有公共的 Add 方法,那么它可能是一个集合。这有点傻,但在实践中它是有效的。
  • 这是一个很好的关于集合抽象的相关资源:blogs.msdn.com/brada/archive/2005/01/18/355755.aspx

标签: c# .net ienumerable


【解决方案1】:

我认为你有点过于复杂了。如果您真的想使用 IEnumerable 但排除 System.String,为什么不直接在代码中执行此操作?

public static bool IsCollection(object obj) {
  return obj is IEnumerable && !(obj is String);
}

【讨论】:

  • 这似乎是唯一的方法。我认为当 BCL 人员设计 String 类型时,他们并没有意识到 IEnumerable 作为引用任何集合的唯一方式有多么重要。
【解决方案2】:

如果你真的只想测试:

bool isCollection = obj.GetType().GetInterfaces()
    .Any(iface => iface.GetGenericTypeDefinition() == typeof(ICollection<>))

但坦率地说,如果您真的只想对string 进行特殊处理(顺便说一句,为什么?),那么就这样做吧。例如,如果您测试 ICollection&lt;&gt;,您将无缘无故地将 LINQ 查询的结果视为“非收集”。

【讨论】:

  • obj.GetType().GetInterface("System.Collections.IEnumerable") != null
【解决方案3】:

如果您想对任何列表/集合/IEnumerable 的 tpyes(包括 nullables)进行检查并为真,但对字符串类型为假,那么

   private static bool IsIEnumerable(Type requestType)
   {
      var isIEnumerable = typeof(IEnumerable).IsAssignableFrom(requestType);
      var notString = !typeof(string).IsAssignableFrom(requestType);
      return isIEnumerable && notString;
   }

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2023-03-12
    • 2021-04-13
    • 1970-01-01
    • 2012-07-22
    • 2013-04-23
    相关资源
    最近更新 更多