如果object是Generic List
有没有办法确定对象是否是通用列表? 我不会知道列表的类型,我只知道它是一个列表。 我怎样才能确定?
这将返回“True”
List myList = new List (); Console.Write(myList.GetType().IsGenericType && myList is IEnumerable);
你是否想知道它是不是一个“列表”……或者你是否可以使用IEnumerable和Generic?
以下方法将返回generics集合类型的项类型。 如果类型未实现ICollection <>则返回null。
static Type GetGenericCollectionItemType(Type type) { if (type.IsGenericType) { var args = type.GetGenericArguments(); if (args.Length == 1 && typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type)) { return args[0]; } } return null; }
编辑:上述解决方案假定指定的类型具有自己的generics参数。 这对于使用硬编码通用参数实现ICollection <>的类型不起作用,例如:
class PersonCollection : List {}
这是一个处理这种情况的新实现。
static Type GetGenericCollectionItemType(Type type) { return type.GetInterfaces() .Where(face => face.IsGenericType && face.GetGenericTypeDefinition() == typeof(ICollection<>)) .Select(face => face.GetGenericArguments()[0]) .FirstOrDefault(); }
尝试:
if(yourList.GetType().IsGenericType) { var genericTypeParams = yourList.GetType().GetGenericArguments; //do something interesting with the types.. }
接受的答案不保证IList <>的类型。 检查这个版本,它适用于我:
private static bool IsList(object value) { var type = value.GetType(); var targetType = typeof (IList<>); return type.GetInterfaces().Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == targetType); }
这个问题含糊不清。
答案取决于通用列表的含义。
-
列表
? -
从List
派生的类? -
实现IList
的类(在这种情况下,数组可以被认为是通用列表 – 例如int []实现IList )? -
一个通用的类并实现IEnumerable(这是在接受的答案中提出的测试)? 但是,这也将考虑以下相当病态的类作为通用列表:
。
public class MyClass : IEnumerable { IEnumerator IEnumerable.GetEnumerator() { return null; } }
最好的解决方案(例如,是否使用GetType,IsAssignableFrom等)将取决于您的意思。
System.Object类中的GetType()函数。 你试过吗?