【问题标题】:Subscribe method to arbitrary event订阅任意事件的方法
【发布时间】: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


【解决方案1】:

使用反射创建和编译与EventHandlerType 匹配的DynamicMethod 签名,其中包含对public object MyMethod(params object[] parameters) 的调用。如果需要,将有一些返回类型的条件代码。

更多信息:https://msdn.microsoft.com/en-us/library/system.reflection.emit.dynamicmethod(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多