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 ref开发者_Python百科lection?
It depends on what exactly you’re asking:
While writing code inside a generic type
Blah<T>
, how do I get the reflection typeT
?Answer:
typeof(T)
I have an object which contains a
List<T>
for some typeT
. How do I retrieve the typeT
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];
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");
}
typeof (T)
or
typeof (T).UnderlyingSystemType
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);
}
精彩评论