我正在尝试编写一个用于从任意事件触发对方法的调用的类,但我被困住了,因为我根本无法从发出的 MSIL 代码中找到引用“this”的方法。
这个例子应该描述我在找什么:
class MyEventTriggeringClass
{
private object _parameter;
public void Attach(object source, string eventName, object parameter)
{
_parameter = parameter;
var e = source.GetType().GetEvent(eventName);
if (e == null) return;
hookupDelegate(source, e);
}
private void hookupDelegate(object source, EventInfo e)
{
var handlerType = e.EventHandlerType;
// (omitted some validation here)
var dynamicMethod = new DynamicMethod("invoker",
null,
getDelegateParameterTypes(handlerType), // (omitted this method in this exmaple)
GetType());
var ilgen = dynamicMethod.GetILGenerator();
var toBeInvoked = GetType().GetMethod(
"invokedMethod",
BindingFlags.NonPublic | BindingFlags.Instance);
ilgen.Emit(OpCodes.Ldarg_0); // <-- here's where I thought I could push 'this' (failed)
ilgen.Emit(OpCodes.Call, toBeInvoked);
ilgen.Emit(OpCodes.Ret);
var sink = dynamicMethod.CreateDelegate(handlerType);
e.AddEventHandler(source, sink);
}
private void invokedMethod()
{
Console.WriteLine("Value of _parameter = " + _parameter ?? "(null)");
// output is always "(null)"
}
}
这是我设想使用的类的示例:
var handleEvent = new MyEventTriggeringClass();
handleEvent.Attach(someObject, "SomeEvent", someValueToBePassedArround);
(请注意,上面的例子毫无意义。我只是试图描述我在寻找什么。我的最终目标是能够在任意事件触发时触发对任意方法的调用。我将使用它在一个 WPF 项目中,我尝试使用 100% MVVM,但我偶然发现了其中一个 [看似] 经典的断点。)
无论如何,只要代码在任意事件触发时成功调用“invokedMethod”,但“this”似乎是一个空对象(_parameter 始终为空),就“工作”。我已经做了一些研究,但根本找不到任何好的例子,其中“this”被正确地传递给从这样的动态方法中调用的方法。
我发现的最接近的示例是THIS ARTICLE但在该示例中,“this”可以强制使用动态方法,因为它是从代码调用的,而不是任意事件处理程序。
任何建议或提示将不胜感激。