如何以编程方式获得泛型类的名称?

本文关键字:泛型类 编程 方式获 | 更新日期: 2023-09-27 18:04:41

我想动态地获得一个类的名称。我可以这样写:

public void RequestData<TResult>()
{
     var myName = typeof(TResult).Name;
}

可以正常工作,例如,如果TResultMyClass类型,那么myName将等于"MyClass"

但是如果result的类型是

List<MyClass> 

我仍然希望myName等于"MyClass"…现在它将是"List ' 1"

如果TResult的类型是List,我如何通过编程知道它是List,然后找出这个列表的类型呢?

如何以编程方式获得泛型类的名称?

这可以在Type上的一些方法的帮助下完成。

public void RequestData<TResult>()
{
    Type type = typeof(TResult);
    string myName;
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
    {
        myName = type.GetGenericArguments()[0].Name;
    }
    else
    {
        myName = typeof(TResult).Name;
    }
}

您可以使用

获得'最左边'的内部泛型类型
public static Type GetInnermost(Type t)
{
    while(t.IsGenericType)
    {
        t = t.GetGenericArguments()[0];
    }
    return t;
}

那么你可以这样做:

var myName = GetInnermost(typeof(TResult)).Name;

然后如。

RequestData<List<IEnumerable<Task<IObserverable<string>>>();

的名称为String

您可以使用GetGenericArguments方法,而returns an array of Type objects that represent the type arguments of a generic type or the type parameters of a generic type definition. (MSDN)。

示例:

public void RequestData<TResult>()
{
     var myName = typeof(TResult).Name;
     var type = typeof(TResult)
     if (type.IsGenericType)
     {
         myName = type.GetGenericArguments().First().Name;
     }
}