0

'myClass'クラスでは、Reflection.Emitを使用して、myClassクラス'メンバーの1つのイベントハンドラーを動的に記述しています。

私はこれを成功させました。

ここで、myClassクラスのインスタンスメソッドの1つを呼び出すようにイベントハンドラーを変更します。

ただし、Reflection.Emitを使用して「this」への参照をMSILスタックにプッシュする方法を理解できません。イベントハンドラー内では、Ldarg_0は「this」への参照ではなく、イベントハンドラーの最初のパラメーターです。

インスタンスメソッドを呼び出すことができるように、スタック上の「this」への参照をプッシュする方法を知っている人はいますか?たとえば、これは私がc#コードを次のように見せたいものです。

public class myClass
{
private myObj1 obj1;
public myClass() {
   this.init();
}

private void init()
{
   obj1.myEvent += new myEvent_EventHandler(theHandler);
}

private void theHandler(myObj2 obj2, myObj3 obj3)
{
   // this is the part I'm having trouble with
   this.myFunction(obj2);
}

private void myFunction(myObj2 obj2)
{
   // irrelevant
}
}

ありがとう!

4

2 に答える 2

3

を使用する場合Reflection.Emit(ここでは推測しDynamicMethodています)、生成されたコードの最初の引数を選択することができ、次のようにデリゲートによって暗黙的に渡すことができます。

using System;
using System.Reflection.Emit;

public class App
{
    static void Main()
    {
        DynamicMethod m = new DynamicMethod("test", typeof(void),
            new[] { typeof(App), // <-- type of first argument, your choice
                typeof(string) });

        var cg = m.GetILGenerator();

        cg.Emit(OpCodes.Ldarg_0);
        cg.Emit(OpCodes.Ldarg_1);
        cg.EmitCall(OpCodes.Call,
            typeof(App).GetMethod("ShowString"), null);

        cg.Emit(OpCodes.Ret);

        Action<string> d = (Action<string>) 
            m.CreateDelegate(typeof(Action<string>), 
            new App()); // <-- this is the first argument, *your* choice

        MyEvent += d;

        // Trigger event
        MyEvent("Hello there");
    }

    static event Action<string> MyEvent;

    public void ShowString(string s)
    {
        Console.WriteLine(s);
    }
}
于 2009-07-13T18:50:25.593 に答える
3

メインにいる場合、メイン クラスのインスタンスはありません。メイン関数は静的です。

于 2009-07-13T18:00:46.503 に答える