C# 具有泛型参数的类的名称?
我正在尝试使用T4为一系列泛型类生成代码 我想知道如何使用反射获取完整的类名C# 具有泛型参数的类的名称?,c#,generics,reflection,t4,texttemplate,C#,Generics,Reflection,T4,Texttemplate,我正在尝试使用T4为一系列泛型类生成代码 我想知道如何使用反射获取完整的类名 public class Foo<TFirst, TSecond> {} var type = typeof(Foo<,>); var name = type.FullName; // returns "Foo`2" 公共类Foo{} 变量类型=类型(Foo); var name=type.FullName;//返回“Foo`2” 我想要的是全名和我写的实际泛型参数名 "Foo<TF
public class Foo<TFirst, TSecond> {}
var type = typeof(Foo<,>);
var name = type.FullName; // returns "Foo`2"
公共类Foo{}
变量类型=类型(Foo);
var name=type.FullName;//返回“Foo`2”
我想要的是全名和我写的实际泛型参数名
"Foo<TFirst, TSecond>"
“Foo”
请注意,它们不是已知的类型,正如我所说,我使用T4生成代码,因此我希望在泛型方法中使用确切的命名来生成代码
我尝试过,但他们要求传递已知类型,这不是我想要的。您可以使用
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}");
}
}
}
使用系统;
公共类Foo{}
课堂测试
{
静态void Main()
{
变量类型=类型(Foo);
WriteLine($“全名:{type.FullName}”);
WriteLine(“类型参数名称:”);
foreach(type.GetGenericArguments()中的var arg)
{
Console.WriteLine($“{arg.Name}”);
}
}
}
注意,这给出了类型参数名称,因为您使用了泛型类型定义;如果使用var type=typeof(Foo)
您将得到String
和Int32
列表(以及更长的类型。全名
)
我自己还没有写过任何T4,所以我不知道这对您是否有任何用处-为了获得
Foo
,您需要编写一些字符串操作逻辑。然而,这是我所知道的获取类型参数的唯一方法。您必须使用arg.Name
而不是arg.FullName
,因为示例代码中的arg.FullName
返回null
(而arg.Name
返回正确的名称)。@Evk:感谢您发现了这一点。我最初尝试使用arg.Name
,并认为在编写时应该将其更改为arg.FullName
,以给出System.String/System.Int32示例。现在就修好!哦,谢谢,我也尝试了string.Join(“,”,type.GetGenericArguments().Select(t=>t.FullName))
,但因为我使用了FullName,所以返回null。