参考“这个”动态事件处理程序(Reference 'this' in dynamic

2019-06-25 19:20发布

在我的“MyClass的”类,我使用Reflection.Emit的动态写MyClass类成员之一的事件处理程序。

我已经成功地做到了这一点。

现在,我要修改的事件处理程序调用在myClass类的实例的方法之一。

然而,我无法弄清楚如何参考推到“这”到使用Reflection.Emit的的MSIL堆栈。 在事件处理程序,Ldarg_0不是“这”的引用,而是事件处理程序的第一个参数。

有谁知道如何参考推到“这”在堆栈上,这样我可以调用一个实例方法。 例如,这就是我想要的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
}
}

谢谢!

Answer 1:

当您使用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);
    }
}


Answer 2:

如果你是主,那么有没有你的主类的实例。 主要功能是静态的。



文章来源: Reference 'this' in dynamic event handler