【发布时间】:2015-05-18 21:31:09
【问题描述】:
在 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 以外的事件的能力并不是严格要求的(尽管这会很好)。
如果可能,我如何使用反射来订阅具有任意签名的事件?
【问题讨论】:
-
您应该将
MethodToInvoke设为Subscribe的参数而不是属性。 -
Dai 的问题是我希望能够将 same 方法订阅到 any 事件,这就是我不这样做的原因不希望它成为一个参数。我总是想订阅
MyMethod,我只想订阅任意事件。
标签: c# events reflection