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

问题描述:

我正在尝试使用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>);你会得到StringInt32上市

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

+1

您似乎需要使用'arg.Name'而不是'arg.FullName',因为示例代码中的'arg.FullName'返回'null'(而'arg.Name'返回正确的名称)。 – Evk

+0

@Evk:感谢您的发现。我最初尝试使用'arg.Name',并认为当我编写它时,我会将其更改为'arg.FullName',以提供System.String/System.Int32示例。现在会修复! –

+0

噢,谢谢,我试过'string.Join(“,”,type.GetGenericArguments()。Select(t => t.FullName))',但是因为我使用的是FullName,所以它返回null。 –