2017-10-14 17 views
2

私はT4を使用して一連の汎用クラスのコードを生成しようとしています。ジェネリックパラメータを持つクラスの名前?

リフレクションを使用してフルクラス名を取得する方法を知りたいですか?私が欲しいもの

public class Foo<TFirst, TSecond> {} 

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

ので、私は私がT4を使用してコードを生成していたとして、彼らは、タイプが知られていないことを

"Foo<TFirst, TSecond>" 

ノートを書いた実際のジェネリックパラメータ名とフルネームであります私は、ジェネリックメソッドの中で、例として、コード生成のためにそれを使用するために正確な命名をしたいと思います。

私は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.FullName'が' null'を返します( 'arg.Name'は正しい名前を返します)ので、' arg.FullName'の代わりに 'arg.Name'を使用する必要があります。 – Evk

+0

@エブク:それを見つけてくれてありがとう。私はもともと 'arg.Name'で試してみましたが、私が' arg.FullName'に変更して書いたときにSystem.String/System.Int32の例を与えると思いました。今修正しよう! –

+0

ああ、ありがとう、私は 'string.Join("、 "、type.GetGenericArguments()。Select(t => t.FullName))'も試みたが、私はFullNameを使用していたのでnullを返していた。 –

関連する問題