我试图使用T4为一系列泛型类生成代码。
我想知道如何使用反射获取完整的班级名称?
public class Foo<TFirst, TSecond> {}
var type = typeof(Foo<,>);
var name = type.FullName; // returns "Foo`2"
我想要的是具有我已经写过的实际通用参数名称的全名
"Foo<TFirst, TSecond>"
请注意,它们不是已知的类型,因为我说我使用T4生成代码,所以我希望有一个确切的命名用于代码生成,例如,在泛型方法中。
我尝试了this answers,但是他们需要传递不属于我想要的已知类型。
答案 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>);
,则会列出String
和Int32
(以及更长的type.FullName
。)
我自己没有写任何T4,所以我不知道这对你是否有用 - 为了到达Foo<TFirst, TSecond>
你需要编写一些字符串操作逻辑。但是,这是我所知道的获取类型参数/参数的唯一方法。