2012-03-21 13 views
5

ジェネリックをILジェネレータで使用することはできますか?ILのジェネリック医薬品は?

 DynamicMethod method = new DynamicMethod(
      "GetStuff", typeof(int), new Type[] { typeof(object) }); 

     ILGenerator il = method.GetILGenerator(); 

     ... etc 
+1

が重複する可能性(HTTP ://stackoverflow.com/questions/788618/dynamicmethod-with-generic-type-parameters) –

+0

あなたの質問からは分かりません:ジェネリックメソッドを作成するか、ジェネリックタイプ(またはメソッド)をその内部に使用したいですか? – svick

+0

@svick:ジェネリックメソッドを動的に作成したい。 – sgtz

答えて

8

はい、可能ですが、DynamicMethodクラスではありません。あなたがこのクラスを使用することに制限されている場合、あなたは運が悪いです。代わりにMethodBuilderオブジェクトを使用できる場合は、をお読みください。

ジェネリックメソッドの本体を送信することは、ほとんどの目的と目的で、ジェネリックタイプのローカル変数を作成できる点を除いて、他のメソッドの本体を放出することと同じです。

MethodBuilder method; 
//... Leaving out code to create MethodBuilder and store in method 
var genericParameters = method.DefineGenericParameters(new[] { "T" }); 
var il = method.GetILGenerator(); 
LocalBuilder genericLocal = il.DeclareLocal(genericParameters[0]); 

このコードを使用して、別の方法からのジェネリックメソッドの呼び出しを放出する:ここで、一般的な引数TとMethodBuilderを使用して一般的な方法を作成し、型Tの局所を作成する例です。 methodがジェネリックメソッドの定義を記述しMethodInfoMethodBuilderオブジェクトであると仮定すると、以下のように、あなたは、単一の汎用パラメータintとそのメソッドの呼び出しを発することができる:[ジェネリック型パラメータを持つDynamicMethod]の

il.EmitCall(OpCodes.Call, method.MakeGenericMethod(typeof(int)), new[] { typeof(int) })); 
+1

'GetGenericArguments()'を呼び出す代わりに、 'DefineGenericParameters()'によって返された配列を使うことができます。 – svick

+0

ありがとう、私はそれを知らなかった。今修正されました。 – aboveyou00

+0

ありがとう@svick&aboveyouOO。私はそれが不可能であったことを読み、とにかく質問すると思った - 私はその情報が以前のバージョンの.net – sgtz

関連する問題