具有泛型参数的类的名称?
问题描述:
我正在尝试使用T4生成一系列泛型类的代码。具有泛型参数的类的名称?
我想知道如何使用反射来获得完整的类名?
public class Foo<TFirst, TSecond> {}
var type = typeof(Foo<,>);
var name = type.FullName; // returns "Foo`2"
我要的是全名与实际泛型参数的名字,我已经写了
"Foo<TFirst, TSecond>"
注意,它们是未知的类型,因为我说我使用T4生成代码,所以我想要确切的命名,以便在代码生成中使用它,例如,在泛型方法中。
我试过this answers但他们需要通过已知类型,这不是我想要的。
答
可以使用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
上市
我没有写任何T4自己,所以我不知道这是否是任何使用您(以及更长的type.FullName
) - 为了要得到Foo<TFirst, TSecond>
,你需要编写一些字符串操作逻辑。但是,这是我知道获取类型参数/参数的唯一方法。
您似乎需要使用'arg.Name'而不是'arg.FullName',因为示例代码中的'arg.FullName'返回'null'(而'arg.Name'返回正确的名称)。 – Evk
@Evk:感谢您的发现。我最初尝试使用'arg.Name',并认为当我编写它时,我会将其更改为'arg.FullName',以提供System.String/System.Int32示例。现在会修复! –
噢,谢谢,我试过'string.Join(“,”,type.GetGenericArguments()。Select(t => t.FullName))',但是因为我使用的是FullName,所以它返回null。 –