C# 具有泛型参数的类的名称?

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

我正在尝试使用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<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。