在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