给定一个Type
对象,最简单的方法是测试它是否实际上是一个对象列表?即数组或IEnumerable / IEnumerable<>。
答案 0 :(得分:50)
检查typeof(IEnumerable).IsAssignableFrom(type)
。
每个集合类型(包括数组和IEnumerable<T>
)都实现IEnumerable
。
答案 1 :(得分:0)
if (objType.IsArray || objType.IsGenericType)
{
}
答案 2 :(得分:0)
typeof(IEnumerable<object>).IsAssignableFrom(propertyInfo.PropertyType)
如果我们要通过通用T进行验证。
答案 3 :(得分:-1)
这不能完全回答问题,但是我认为这对那些撰写这篇文章的人来说是有用的代码。
鉴于对象或 IList
IList<string> someIds = new string[0];
if (someIds is Array)
{
// yes!
}
IList<string> someIds = new List<string>(0);
if (someIds is Array)
{
// nop!
}
这里的区别是我们不使用任何Type
对象,而是使用 actual 对象。
答案 4 :(得分:-1)
我建议使用模式匹配。 就像在这个示例方法中一样:
public static bool IsNullOrEmpty<T>(this IEnumerable<T> items)
{
if (items == null)
return true;
if (items is T[] arr)
return arr.Length == 0;
return !items.Any();
}
答案 5 :(得分:-5)
简单。最简单的方法是:
IList<T> listTest = null;
try{
listTest = ((IList<T>)yourObject);
}
catch(Exception listException)
{
//your object doesn't support IList and is not of type List<T>
}
IEnumerable<T> enumerableTest = null;
try{
enumerableTest = ((IEnumerable<T>)yourObject);
}
catch(Exception enumerableException)
{
//your object doesn't suport IEnumerable<T>;
}
=============================================== ===
您也可以尝试使用不涉及多个try / catch块的内容。如果你可以避免使用它们会更好,因为每个条件实际上都是由运行时在运行时进行评估的...它是错误的代码(尽管有时它没有办法解决它)。
Type t = yourObject.GetType();
if( t is typeof(List<OjbectType>) ) //object type is string, decimal, whatever...
{
// t is of type List<ObjectType>...
}
else if( t is typeof(IEnumerable<ObjectType>)
{
// t is of type IEnumerable<ObjectType>...
}
else
{
// t is some other type.
// use reflection to find it.
}