IL Generator でジェネリックを使用することは可能ですか?
DynamicMethod method = new DynamicMethod(
"GetStuff", typeof(int), new Type[] { typeof(object) });
ILGenerator il = method.GetILGenerator();
... etc
IL Generator でジェネリックを使用することは可能ですか?
DynamicMethod method = new DynamicMethod(
"GetStuff", typeof(int), new Type[] { typeof(object) });
ILGenerator il = method.GetILGenerator();
... etc
はい、可能ですが、DynamicMethodクラスではできません。このクラスの使用に制限されている場合は、運が悪いです。代わりにオブジェクトを使用できる場合はMethodBuilder、読み進めてください。
ジェネリックメソッドの本体を発行することは、ほとんどの目的と目的で、ジェネリック型のローカル変数を作成できることを除いて、他のメソッドの本体を発行することと同じです。MethodBuilderジェネリック引数Tを使用してジェネリックメソッドを作成し、タイプTのローカルを作成する例を次に示します。
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]);
別のメソッドからそのジェネリックメソッドへの呼び出しを発行するには、このコードを使用します。methodがジェネリックメソッド定義を記述するMethodInfoorオブジェクトであるとすると、次のようMethodBuilderに単一のジェネリックパラメーターを使用してそのメソッドの呼び出しを発行できます。int
il.EmitCall(OpCodes.Call, method.MakeGenericMethod(typeof(int)), new[] { typeof(int) }));