如何使用反射在运行时获取泛型List中T的实际类型?
如何使用反射在运行时获取泛型List中T的实际类型?
这要看你具体在问什么:
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];
List<T>
中的类型T。List<T>
,此方法将返回其类型。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");
}
GetGenericType(list)
,list
的类型在编译时必须是List<X>
,其中X
在编译时已知,因此无论X
是什么,你都可以轻松地编写typeof(X)
。 - Timwitypeof (T)
或者
typeof (T).UnderlyingSystemType
通过动态
实现新的解决方案旧问题
void Foo(){
Type type GetTypeT(data as dynamic);
}
private static Type GetTypeT<T>(IEnumerable<T> data)
{
return typeof(T);
}