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

前端 未结 16 1875
梦毁少年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:23

    (note: I'm assuming that all you know is object or IList or similar, and that the list could be any type at runtime)

    If you know it is a List<T>, then:

    Type type = abc.GetType().GetGenericArguments()[0];
    

    Another option is to look at the indexer:

    Type type = abc.GetType().GetProperty("Item").PropertyType;
    

    Using new TypeInfo:

    using System.Reflection;
    // ...
    var type = abc.GetType().GetTypeInfo().GenericTypeArguments[0];
    
    0 讨论(0)
  • 2020-11-22 03:24

    If I understand correctly, your list has the same type parameter as the container class itself. If this is the case, then:

    Type typeParameterType = typeof(T);
    

    If you are in the lucky situation of having object as a type parameter, see Marc's answer.

    0 讨论(0)
  • 2020-11-22 03:24

    With the following extension method you can get away without reflection:

    public static Type GetListType<T>(this List<T> _)
    {
        return typeof(T);
    }
    

    Or more general:

    public static Type GetEnumeratedType<T>(this IEnumerable<T> _)
    {
        return typeof(T);
    }
    

    Usage:

    List<string>        list    = new List<string> { "a", "b", "c" };
    IEnumerable<string> strings = list;
    IEnumerable<object> objects = list;
    
    Type listType    = list.GetListType();           // string
    Type stringsType = strings.GetEnumeratedType();  // string
    Type objectsType = objects.GetEnumeratedType();  // BEWARE: object
    
    0 讨论(0)
  • 2020-11-22 03:25

    Consider this: I use it to export 20 typed list by same way:

    private void Generate<T>()
    {
        T item = (T)Activator.CreateInstance(typeof(T));
    
        ((T)item as DemomigrItemList).Initialize();
    
        Type type = ((T)item as DemomigrItemList).AsEnumerable().FirstOrDefault().GetType();
        if (type == null) return;
        if (type != typeof(account)) //account is listitem in List<account>
        {
            ((T)item as DemomigrItemList).CreateCSV(type);
        }
    }
    
    0 讨论(0)
提交回复
热议问题