How to get the type of T from a member of a generic class or method?

前端 未结 16 1930
梦毁少年i
梦毁少年i 2020-11-22 02:37

Let say I have a generic member in a class or method, so:

public class Foo
{
    public List Bar { get; set; }

    public void Baz()
    {         


        
16条回答
  •  既然无缘
    2020-11-22 03:21

    You can get the type of "T" from any collection type that implements IEnumerable with the following:

    public static Type GetCollectionItemType(Type collectionType)
    {
        var types = collectionType.GetInterfaces()
            .Where(x => x.IsGenericType 
                && x.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            .ToArray();
        // Only support collections that implement IEnumerable once.
        return types.Length == 1 ? types[0].GetGenericArguments()[0] : null;
    }
    

    Note that it doesn't support collection types that implement IEnumerable twice, e.g.

    public class WierdCustomType : IEnumerable, IEnumerable { ... }
    

    I suppose you could return an array of types if you needed to support this...

    Also, you might also want to cache the result per collection type if you're doing this a lot (e.g. in a loop).

提交回复
热议问题