私は次のようなクラスを持っています:
public class ClassWithFuncConstructor
{
public ClassWithFuncConstructor(Func<int> func)
{
}
}
次に、クラスを使用して、次のようなクラスDynamicMethod
のインスタンスを作成するために必要なコードを出力します。ClassWithFuncConstructor
public void DynamicMethodPrototype()
{
var instance = new ClassWithFuncConstructor(() => 42);
}
このプロトタイプ用にコンパイルされたコード(LinqPadから)を見ると、関数デリゲートの本体である別のメソッドが作成され、そのメソッドへのポインターがコンストラクターパラメーターとして渡されていることがわかります。
DynamicMethodPrototype:
IL_0000: nop
IL_0001: ldsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate1
IL_0006: brtrue.s IL_001B
IL_0008: ldnull
IL_0009: ldftn UserQuery.<DynamicMethodPrototype>b__0
IL_000F: newobj System.Func<System.Int32>..ctor
IL_0014: stsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate1
IL_0019: br.s IL_001B
IL_001B: ldsfld UserQuery.CS$<>9__CachedAnonymousMethodDelegate1
IL_0020: newobj UserQuery+ClassWithFuncConstructor..ctor
IL_0025: stloc.0
IL_0026: ret
<DynamicMethodPrototype>b__0:
IL_0000: ldc.i4.s 2A
IL_0002: stloc.0
IL_0003: br.s IL_0005
IL_0005: ldloc.0
IL_0006: ret
DynamicMethod
問題は、クラスを使用してこれをどのように行うことができるかということです。<DynamicMethodPrototype>b__0:
そのメソッドへの参照をClassWithFuncConstructor
クラスのコンストラクターに渡すことができるように、新しい匿名メソッド(別名)を作成する必要があります。
DynamicMethod
これはクラスでも可能ですか?