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

时间:2014-05-21 18:48:57

标签: c# .net generics

我想动态获取类的名称。我可以用这个:

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

哪种方法很好,例如如果TResult的类型为MyClass,那么myName将等于"MyClass"

但如果TResult属于

类型
List<MyClass> 

我仍然希望myName等于&#34; MyClass&#34; ......目前它将是&#34; List`1&#34;

因此,如果TResult类型为List,我怎样才能以编程方式知道它是List然后选择此列表类型的名称?

3 个答案:

答案 0 :(得分:3)

可以借助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;
    }
}

答案 1 :(得分:2)

你可以得到最左边的&#39;内部泛型类型

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

答案 2 :(得分:1)

您可以使用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)。{/ p>的GetGenericArguments方法

样本:

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