2017-10-14 87 views
2

我正在嘗試使用T4生成一系列泛型類的代碼。具有泛型參數的類的名稱?

我想知道如何使用反射來獲得完整的類名?

public class Foo<TFirst, TSecond> {} 

var type = typeof(Foo<,>); 
var name = type.FullName; // returns "Foo`2" 

我要的是全名與實際泛型參數的名字,我已經寫了

"Foo<TFirst, TSecond>" 

注意,它們是未知的類型,因爲我說我使用T4生成代碼,所以我想要確切的命名,以便在代碼生成中使用它,例如,在泛型方法中。

我試過this answers但他們需要通過已知類型,這不是我想要的。

回答

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>);你會得到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。 –

相關問題