具有通用参数的类的名称?

时间:2017-10-14 14:14:30

标签: c# generics reflection t4 texttemplate

我试图使用T4为一系列泛型类生成代码。

我想知道如何使用反射获取完整的班级名称?

public class Foo<TFirst, TSecond> {}

var type = typeof(Foo<,>);
var name = type.FullName; // returns "Foo`2"

我想要的是具有我已经写过的实际通用参数名称的全名

"Foo<TFirst, TSecond>"

请注意,它们不是已知的类型,因为我说我使用T4生成代码,所以我希望有一个确切的命名用于代码生成,例如,在泛型方法中。

我尝试了this answers,但是他们需要传递不属于我想要的已知类型。

1 个答案:

答案 0 :(得分:4)

您可以使用Type.GetGenericArguments

通过反射访问类型参数名称
using System;

public class Foo<TFirst, TSecond> {}

class Test
{
    static void Main()
    {
        var type = typeof(Foo<,>);
        Console.WriteLine($"Full name: {type.FullName}");
        Console.WriteLine("Type argument names:");
        foreach (var arg in type.GetGenericArguments())
        {
            Console.WriteLine($"  {arg.Name}");
        }
    }
}

请注意,因为您使用了泛型类型定义,所以提供参数类型的名称;如果您使用var type = typeof(Foo<string, int>);,则会列出StringInt32(以及更长的type.FullName。)

我自己没有写任何T4,所以我不知道这对你是否有用 - 为了到达Foo<TFirst, TSecond>你需要编写一些字符串操作逻辑。但是,这是我所知道的获取类型参数/参数的唯一方法。