订阅任意事件的方法

时间:2015-05-18 21:31:10

标签: c# events reflection

在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以外的事件的处理能力并非严格要求(尽管它会很好)。

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

1 个答案:

答案 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