订阅任意事件的方法

Subscribe method to arbitrary event

在 C# 中,我想使用反射来订阅具有任意签名的事件的方法。考虑以下代码:

void Subscribe(object objectWithEvent, string eventName) {
    EventInfo eventInfo = objectWithEvent.GetType().GetEvent(eventName);
    MethodInfo addMethod = eventInfo.GetAddMethod();
    MethodInfo MethodToInvoke = this.GetType().GetMethod("MyMethod");
    Delegate d = Delegate.CreateDelegate(eventInfo.EventHandlerType, this, MethodToInvoke);
    addMethod.Invoke(objectWithEvent, new object[1]{ d });
}

此代码成功订阅 MyMethodobjectWithEvent.EventName,但 如果事件与 MyMethod 的签名完全匹配。我希望能够订阅 MyMethod 任何事件,也许通过声明 MyMethod 如下:

public void MyMethod(params object[] parameters)

但是,仅仅这样做是行不通的。

还有 return 类型需要担心。大多数事件处理程序 return void,因此处理 return 而非 void 的事件的能力并不是严格要求的(尽管它会很好)。

如果可能,如何使用反射来订阅具有任意签名的事件?

使用反射创建和编译 DynamicMethod 匹配 EventHandlerType 的签名,其中包含对 public object MyMethod(params object[] parameters) 的调用。如果需要,return 类型会有一些条件代码。

更多信息:https://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod(v=vs.110).aspx