订阅任意事件的方法

本文关键字:方法 事件 任意 | 更新日期: 2023-09-27 17:49:41

在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 });
}

此代码成功地将MyMethod订阅到objectWithEvent.EventName,但只有当事件与MyMethod的签名完全匹配时,才会。我希望能够订阅MyMethod参加任何事件,也许可以这样声明MyMethod:

public void MyMethod(params object[] parameters)
然而,仅仅这样做是行不通的。

还需要考虑返回类型。大多数事件处理程序返回void,因此处理返回void以外的事件的能力并不是严格要求的(尽管这很好)。

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

订阅任意事件的方法

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

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