C# 获取泛型列表中T的实际类型<;T>;
如何在运行时使用反射获取泛型列表中T的实际类型?您可以使用返回C# 获取泛型列表中T的实际类型<;T>;,c#,generics,reflection,C#,Generics,Reflection,如何在运行时使用反射获取泛型列表中T的实际类型?您可以使用返回列表中的T类型 例如,这将返回作为参数传递的任何列表的类型: Type GetListType(object list) { Type type = list.GetType(); if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>)) return type.GetGeneri
列表中的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");
}
类型GetListType(对象列表)
{
Type Type=list.GetType();
if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(列表))
返回类型。GetGenericArguments()[0];
其他的
抛出新ArgumentException(“列表不是列表”、“列表”);
}
或
这取决于你到底在问什么:
- 在泛型类型中编写代码时,如何获取反射类型
T
?
回答:typeof(T)
- 我有一个对象,其中包含某个类型
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];
var objectType=myList.GetType();
如果(!objectType.IsGenericType()||
objectType.GetGenericTypeDefinition()!=typeof(列表))
{
抛出新的InvalidOperationException(
“对象不是任何T的类型列表”);
}
var elementType=objectType.GetGenericArguments()[0];
通过动态
void Foo(){
Type type GetTypeT(data as dynamic);
}
private static Type GetTypeT<T>(IEnumerable<T> data)
{
return typeof(T);
}
void Foo(){
类型GetTypeT(数据为动态);
}
私有静态类型GetTypeT(IEnumerable数据)
{
返回类型(T);
}
您当前的代码是什么样子的?一点上下文可能有助于复制不是真正有用的对象:您只能在其中传递一个对象,您在编译时已经知道该对象的类型。@Timwi-我可以想到很多地方这很有用,只是因为您在编译时有一个T
,并不意味着您知道它(例如,通用约束)。有几种方法可以做到这一点,例如在IQueryable
上使用ElementType
,但不要认为这没有用。@Timwi:虽然我把它当作一个非常简单的使用场景,但它也完全是通过反射工作的。GetGenericArguments调用是通过反射实现这一点的主要方法。当然,在这种情况下,我可以返回typeof(T)并完成它-但我不知道OP首先是如何得到“列表”的。。。这就是说,在某些情况下,在像这样的泛型方法中对泛型参数进行反射是有用的…@Nick,@Reed:您能提供一些实际有用的示例代码(例如通过pastebin.com)吗?在我看来,无论您在哪里编写GetGenericType(list)
,编译时list
的类型必须是list
,编译时已知X
,因此无论X
是什么,您都可以轻松地编写typeof(X)
。@Timwi:这会让您更快乐吗?现在它通过反射得到完整的类型。。。包括通过IsGenericType+TypeDefinition检查查看它是否是列表的正确检查…顺便说一句-如果“myList”不是泛型类型,这将引发GetGenericTypeDefinition()。。。如果要进行错误检查,还应该包括对IsGenericType的检查。
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];
void Foo(){
Type type GetTypeT(data as dynamic);
}
private static Type GetTypeT<T>(IEnumerable<T> data)
{
return typeof(T);
}