2016-12-23 2 views
2

宣言されたパラメータ名を持つジェネリッククラスの名前を生成したいとします。たとえば、ジェネリッククラスがあり、以下に示すようにインスタンス化されたインスタンスの場合は、"MyClass<P1,M>"を印刷します。C#のジェネリック型のGenericTypeParametersへのアクセス

​​

は今、私はmyInstanceのための私の型情報を取得してから、このような一般的な型定義:

// MyClass<int,string> type info here 
var type = myInstance.GetType(); 
// MyClass<P1, M1> type info here 
var genericType = type.GetGenericTypeDefinition(); 

デバッガは、すべてのパラメータ名と型情報付きgenericTypeプロパティGenericTypeParametersを示しています。しかし、私はC#コードからそのコレクションにアクセスすることはできません。ランタイムタイプが内部であるため、genericTypeをSystem.RuntimeTypeクラスにキャストできません。

ここで何とかGenericTypeParametersプロパティにアクセスする方法はありますか、ここにはありますか? 環境VS2015、.NET 4.6.1

答えて

4

私はあなたがちょうどあなたがgenericTypeはなくtypeに呼び出す必要がありType.GetGenericArguments、探していると思います - その時点では、タイプ「引数は」本当にタイプですパラメータ理由それはオープンタイプです。 (簡単にするためにDictionary<,>を使用して)

サンプル:あなた自身をなどの書式文字列をうまくすることができ、その情報に基づいてうまくいけば

using System; 
using System.Collections.Generic; 

class Test 
{ 
    static void Main() 
    { 
     var dictionary = new Dictionary<string, int>(); 
     var type = dictionary.GetType(); 
     var genericType = type.GetGenericTypeDefinition(); 
     foreach (var typeArgument in genericType.GetGenericArguments()) 
     { 
      // TKey, then TValue 
      Console.WriteLine(typeArgument); 
     } 
    } 
} 

+0

@MichaelLiu:ああ、そうです、whoops、misread。削除し、編集して元に戻します。 –

+0

恐ろしい!かなり多くのGetGenericArguments()は、デバッガで見ることのできるGenericTypeParametersプロパティを返します。今は混乱が起こった。 –

関連する問題