确定集合是否为IEnumerable <T>types

如何确定对象的types是IEnumerable <T>?

码:

namespace NS { class Program { static IEnumerable<int> GetInts() { yield return 1; } static void Main() { var i = GetInts(); var type = i.GetType(); Console.WriteLine(type.ToString()); } } } 

输出:

 NS.1.Program+<GetInts>d__0 

如果我改变GetInts返回IList,一切都OK了输出是:

  System.Collections.Generic.List`1[System.Int32] 

这返回false:

 namespace NS { class Program { static IEnumerable<int> GetInts() { yield return 1; } static void Main() { var i = GetInts(); var type = i.GetType(); Console.WriteLine(type.Equals(typeof(IEnumerable<int>))); } } } 

如果你的意思是收集 ,那么就像:

 var asEnumerable = i as IEnumerable<int>; if(asEnumerable != null) { ... } 

不过,我假设(从例子),你有一个Type

对象将永远不会是“的”typesIEnumerable<int> – 但它可能会实现它; 我期望:

 if(typeof(IEnumerable<int>).IsAssignableFrom(type)) {...} 

会做。 如果你不知道Tint在上面),那么检查所有实现的接口:

 static Type GetEnumerableType(Type type) { foreach (Type intType in type.GetInterfaces()) { if (intType.IsGenericType && intType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) { return intType.GetGenericArguments()[0]; } } return null; } 

并致电:

 Type t = GetEnumerableType(type); 

如果这个值为null,那么任何T都不是IEnumerable<T> – 否则检查t

和Marc的答案一样,但Linqier:

 namespace NS { class Program { static IEnumerable<int> GetInts() { yield return 1; } static void Main() { var i = GetInts(); var type = i.GetType(); var isEnumerableOfT = type.GetInterfaces() .Any(ti => ti.IsGenericType && ti.GetGenericTypeDefinition() == typeof(IEnumerable<>)); Console.WriteLine(isEnumerableOfT); } } } 

由于IEnumerable <T>inheritanceIEnumerable(非generics),如果不需要知道何时types只是IEnumerable而不是IEnumerable <T>,那么可以使用:

  if (typeof(IEnumerable).IsAssignableFrom(srcType)) 

如何确定对象的types是IEnumerable <T>?

请随意使用这个优良的,超小的通用扩展方法来确定是否有任何对象实现了IEnumerable接口。 它扩展了Objecttypes,所以你可以使用你正在使用的任何对象的任何实例来执行它。

 public static class CollectionTestClass { public static Boolean IsEnumerable<T>(this Object testedObject) { return (testedObject is IEnumerable<T>); } } 

i的types是NS.1.Program+<GetInts>d__0 ,它是IEnumerable<int>子types 。 因此,你可以使用

 if (i is IEnumerable<int>) { ... } 

或者IsAssignableFrom (就像Marc的回答)。

您可以使用is关键字。

 [TestFixture] class Program { static IEnumerable<int> GetInts() { yield return 1; } [Test] static void Maasd() { var i = GetInts(); Assert.IsTrue(i is IEnumerable<int>); } } 

如何检测types是否是另一种generics应该可以帮助你解决这个问题。