订阅任意事件的方法
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 });
}
此代码成功订阅 MyMethod
到 objectWithEvent.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
在 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)
但是,仅仅这样做是行不通的。
还有 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