【发布时间】:2015-11-30 05:51:49
【问题描述】:
如何在运行时使用反射在泛型列表中获取 T 的实际类型?
【问题讨论】:
-
您当前的代码是什么样的?一些上下文会有所帮助
标签: c# generics reflection
如何在运行时使用反射在泛型列表中获取 T 的实际类型?
【问题讨论】:
标签: c# generics reflection
这取决于你到底要问什么:
在泛型类型Blah<T> 中编写代码时,如何获取反射类型T?
回答:typeof(T)
我有一个对象,其中包含某个类型 T 的 List<T>。如何通过反射检索类型T?
简答:myList.GetType().GetGenericArguments()[0]
长答案:
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];
【讨论】:
您可以使用Type.GetGenericArguments 在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");
}
【讨论】:
T,并不意味着你知道它(例如通用约束)。有几种方法可以解决它,例如ElementType IQueryable<T>,但不要认为它没有用。
GetGenericType(list),list 的类型在编译时必须是List<X>,而X 在编译时是已知的,所以无论X 是什么,你都可以就像轻松写 typeof(X) 一样。
typeof (T)
或
typeof (T).UnderlyingSystemType
【讨论】:
dynamic新解决老问题
void Foo(){
Type type GetTypeT(data as dynamic);
}
private static Type GetTypeT<T>(IEnumerable<T> data)
{
return typeof(T);
}
【讨论】: