如果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()函数。 你试过吗?