在C#中,我想使用Reflection为具有任意签名的事件订阅方法。请考虑以下代码:
promote_to_client_contact_path
此代码成功订阅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
以外的事件的处理能力并非严格要求(尽管它会很好)。
如果可能,如何使用反射来订阅具有任意签名的事件?
答案 0 :(得分:1)
使用Reflection创建和编译包含EventHandlerType
调用的public object MyMethod(params object[] parameters)
的DynamicMethod匹配签名。如果需要,返回类型将有一些条件代码。
更多信息:https://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod(v=vs.110).aspx