Max*_*oro 6 .net c# ienumerable
我有一个方法接受System.Object类型的参数obj
现在我想检查一下obj的实际类型是:
我想到的第一种方式是:
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)
有没有更好的办法?
我觉得你有点过于复杂了.如果你真的想使用IEnumerable但排除System.String,为什么不直接在代码中这样做呢?
public static bool IsCollection(object obj) {
return obj is IEnumerable && !(obj is String);
}
Run Code Online (Sandbox Code Playgroud)
如果你真的只想测试:
bool isCollection = obj.GetType().GetInterfaces()
.Any(iface => iface.GetGenericTypeDefinition() == typeof(ICollection<>))
Run Code Online (Sandbox Code Playgroud)
但坦率地说,如果你真的只想要特殊情况string(为什么,顺便说一下?),那就这样做吧.如果你测试ICollection<>,你会将LINQ查询的结果视为"非集合",例如,没有充分的理由.
| 归档时间: |
|
| 查看次数: |
4637 次 |
| 最近记录: |