确定集合是否为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)) {...}
会做。 如果你不知道T
( int
在上面),那么检查所有实现的接口:
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应该可以帮助你解决这个问题。