C# 获取泛型列表中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的实际类型?

您可以使用返回
列表中的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);
}