3

私は次のようなクラスを持っています:

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これはクラスでも可能ですか?

4

0 に答える 0