假设我有一个可能类型的对象IEnumerable<T>.我想写一个方法,如果对象是类型IEnumerable<T>,不是null,并且不为空,则返回true .
这是我到目前为止所得到的:
public bool IsNullOrEmpty(object obj)
{
if (obj != null)
{
if (obj is IEnumerable<object>)
{
return (obj as IEnumerable<object>).Any();
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
如果我传入一个类型的对象List<string>,但是如果我传入一个类型的对象则不行List<int>.失败是因为因为obj is IEnumerable<object>回归false.
知道如何让所有通用IEnumerables工作吗?
TyC*_*obb 11
由于类型可能是未知的,您可以尝试检查IEnumerable接口并MoveNext()在枚举器上使用.
编辑:我更新了方法名称.由于原始问题代码检查集合中是否有项目,因此现在使用逻辑更有意义.
public bool IsNotNullOrEmpty(object enumerable)
{
if (enumerable != null)
{
if (enumerable is IEnumerable)
{
using(var enumerator = ((IEnumerable)enumerable).GetEnumerator())
return enumerator.MoveNext();
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
System.Collections.Generic.IEnumerable<T>继承System.Collections.IEnumerable- 因此,如果你可以检查非泛型IEnumerable,而不是泛型IEnumerable<T>,你可以只是转换为IEnumerable.
关于你的代码的一些注意事项:你首先检查is,然后你投了as.这通常是不必要的; 如果演员表失败,as已经检查并返回null.因此,更短的方法是:
var enumerable = obj as IEnumerable;
if (enumerable != null) {
return !enumerable.Cast<object>().Any();
}
Run Code Online (Sandbox Code Playgroud)
请注意,您需要额外的呼叫Cast,因为Any需要通用IEnumerable<T>.