.NET Reflection: Detecting IEnumerable

后端 未结 3 1361
南旧
南旧 2021-01-04 10:27

I\'m trying to detect if a particular instance of a Type object is a generic \"IEnumerable\"...

The best I can come up with is:

// theType might be t         


        
相关标签:
3条回答
  • 2021-01-04 10:52

    You can use

    if(theType.IsGenericType && theType.GetGenericTypeDefinition() == typeof(IEnumerable<>))
    {
        Type underlyingType = theType.GetGenericArguments()[0];
        //do something here
    }
    

    EDIT: added the IsGenericType check, thanks for the useful comments

    0 讨论(0)
  • 2021-01-04 10:55

    Note that you cannot call GetGenericTypeDefinition() on a non-generic type, therefore, first check with IsGenericType.

    I'm not sure if you want to check whether a type implements a generic IEnumerable<> or if you want to see if an interface type is IEnumerable<>. For the first case, use the following code (the inner check with interfaceType is the second case):

    if (typeof(IEnumerable).IsAssignableFrom(type)) {
        foreach (Type interfaceType in type.GetInterfaces()) {
            if (interfaceType.IsGenericType && (interfaceType.GetGenericTypeDefinition() == typeof(IEnumerable<>))) {
                Console.WriteLine("{0} implements {1} enumerator", type.FullName, interfaceType.FullName); // is a match
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-04 11:03

    You can use this piece of code to determine if a particular type implements the IEnumerable<T> interface.

    Type type = typeof(ICollection<string>);
    
    bool isEnumerable = type.GetInterfaces()       // Get all interfaces.
        .Where(i => i.IsGenericType)               // Filter to only generic.
        .Select(i => i.GetGenericTypeDefinition()) // Get their generic def.
        .Where(i => i == typeof(IEnumerable<>))    // Get those which match.
        .Count() > 0;
    

    It will work for any interface, however it will not work if the type you pass in is IEnumerable<T>.

    You should be able to modify it to check the type arguments passed to each interface.

    0 讨论(0)
提交回复
热议问题