Get actual type of T in a generic List

前端 未结 4 1073
隐瞒了意图╮
隐瞒了意图╮ 2021-01-14 01:44

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

相关标签:
4条回答
  • 2021-01-14 01:50
    typeof (T)
    

    or

    typeof (T).UnderlyingSystemType
    
    0 讨论(0)
  • 2021-01-14 02:01

    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];
      
    0 讨论(0)
  • 2021-01-14 02:02

    New solution old problem by dynamic

    void Foo(){
       Type type GetTypeT(data as dynamic);
    }
    
    private static Type GetTypeT<T>(IEnumerable<T> data)
    {
        return typeof(T);
    }
    
    0 讨论(0)
  • 2021-01-14 02:04

    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");
    }
    
    0 讨论(0)
提交回复
热议问题