Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get actual type of T in a generic List<T>

How do I get the actual type of T in a generic List at run time using reflection?

like image 465
John Egbert Avatar asked Dec 21 '22 23:12

John Egbert


2 Answers

You can use Type.GetGenericArguments to return the type T in a List<T>.

For example, this will return the Type for any List<T> passed as an argument:

Type GetListType(object list)
{
    Type type = list.GetType();
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
        return type.GetGenericArguments()[0];
    else
        throw new ArgumentException("list is not a List<T>", "list");
}
like image 44
Reed Copsey Avatar answered Jan 03 '23 01:01

Reed Copsey


It depends on what exactly you’re asking:

  • While writing code inside a generic type Blah<T>, how do I get the reflection type T?

    Answer: typeof(T)

  • I have an object which contains a List<T> for some type T. How do I retrieve the type T via reflection?

    Short answer: myList.GetType().GetGenericArguments()[0]

    Long answer:

    var objectType = myList.GetType();
    if (!objectType.IsGenericType() ||
        objectType.GetGenericTypeDefinition() != typeof(List<>))
    {
        throw new InvalidOperationException(
            "Object is not of type List<T> for any T");
    }
    var elementType = objectType.GetGenericArguments()[0];
    
like image 67
Timwi Avatar answered Jan 03 '23 02:01

Timwi