【发布时间】: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