在我的“myClass”类中,我使用 Reflection.Emit 为 myClass 类成员之一动态编写事件处理程序。
我已经成功地做到了这一点。
现在,我想修改事件处理程序以调用 myClass 类中的实例方法之一。
但是,我无法弄清楚如何使用 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
}
}
Thanks!
当你使用Reflection.Emit
(我假设DynamicMethod
here), you选择生成代码的第一个参数是什么,它可以由委托隐式传递,如下所示:
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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)