2012-01-11 9 views
3

私はこの問題についてインターネット上で何かを見つけられませんでしたが、おそらく私は間違った言葉を探しています。ここで私は何をする必要があります。インスタンス化されたジェネリックのパラメータタイプを取得するにはどうすればよいですか?

簡略化のため、汎用タイプがList<string>であるとします。パラメータタイプ(この場合はtypeof(string))を取得するにはどうすればよいですか?

私はジェネリッククラスの外からこれを行う必要があることを覚えておいてください(他のSOの質問で見たようなクラスメソッド内ではありません)。一番下の行は、ジェネリック型のインスタンスがあることです。その型とそのパラメータの型を知る必要があります(上記の例では、のようなものではなく、typeof(List)typeof(string)の両方を取得したいと思います)。もちろん、これは実行時に実行する必要があります。

返信いただける方々のおかげです。

+1

[可能なジェネリック型の型引数を取得する方法は?](http://stackoverflow.com/questions/2549567/how-do-i-get-the-type-argument-of-a -generic-type) –

+0

実際、Igby。重複して申し訳ありませんが、私は正直にそれを見つけることができませんでした。フォームで提案された同様の質問を見ても、適切なものは見つかりませんでした。誰にもお返事ありがとう! – Simone

答えて

2
var myList = new List<String>(); 
var shouldBeString = myList.GetType().GetGenericArguments().FirstOrNull(); 
var shouldBeGenericList = myList.GetType().GetGenericTypeDefinition(); 

http://msdn.microsoft.com/en-us/library/system.type.getgenericarguments.aspxhttp://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspxがそれぞれ

+0

私はこの完全性のためにのみこれを承認していますが、HarpoとOsmanの答えは同じです。ありがとうございました! – Simone

4
typeof(List<string>).GetGenericArguments()[0] 
+0

+1は答えの一部を供給します。 – Jordan

1

は、なぜあなたはあなたの関数は一般的なことはありませんか?それはコンパイラがあなたのためにそれを並べ替えることができます。

void your_func<T>(List<T> lst) 
{ 
    Type list_type = typeof(List<T>); 
    Type generic_list_type = typeof(List<>); 
    Type generic_argument_type = typeof(T); 
    // do what you need  
} 

あなたは、通常のようにそれを呼び出すことができます。

var lst = new List<string>(); 
// ... 
obj.your_func(lst); 

その他のオプションは、他の回答で説明したようにリフレクションを使用することです。

+0

Krizz、ジェネリック型がListであることはわかりません。実際には、それがジェネリックなタイプであるかどうか、それにどれくらいのジェネリックパラメータがあるかといった事前の知識なしに、どのタイプにも対処する必要があります。これが私がこの方法を使うことができない理由です。 – Simone

+0

わかりました。私は質問からはっきりとは分かりませんでした。次に、他の回答に記載されているように、あなたは間違いなく反射のために行く必要があります。 – Krizz

関連する問題