2

我创建了一个基于事件的系统,其中一个类将提供一堆事件,另一个类及其成员方法可以作为其事件处理程序附加到第一个类,并且......我只想做这样的事情

if(isMethodCompatibleToEvent(...))
{
    connectMethodToEvent(...)
}

通过反射,这就是连接的完成方式:

void connectMethodToEvent(object methodTarget, MethodInfo mi,
    object eventTarget, EventInfo ei)
{
    Delegate handler = Delegate.CreateDelegate(ei.EventHandlerType, methodTarget, mi);
    ei.AddEventHandler(eventTarget, handler);
}

如果该方法与事件不兼容,它将引发异常,为了解决这个问题,我想在创建方法委托之前创建一些检查,但是如何?

bool isMethodCompatibleToEvent(object methodTarget, MethodInfo mi,
    object eventTarget, EventInfo ei)
{
    // HOW ?
}
4

2 回答 2

2
  • 形式参数的数量必须相同。
  • 形参的“refness”必须相同。(从技术上讲,带有out参数的方法可以用于带有ref参数的事件,反之亦然,但我不推荐它。)
  • 每个形式参数类型必须兼容。对于值类型,它们必须完全匹配。对于引用类型的形式参数,允许逆变。也就是说,如果您有一个要将 Giraffe 传递给委托的事件处理程序,则允许委托接受 Animal。
  • 返回类型的“无效性”必须相同;void只匹配void.
  • 对于非 void 返回类型,值类型必须完全匹配。对于返回引用类型的事件处理程序,允许协变。也就是说,如果事件处理程序说它返回 Animal 而委托返回 Giraffe,那很好。

这些不是所有规则,但它们足以处理绝大多数常见情况。

于 2013-06-02T16:32:27.177 回答
0

您将需要比较方法和委托的签名(定义事件的类型):如果它们匹配,则可以将方法组合到事件中。

参数和返回类型的精确匹配显然是最简单的,但也要考虑隐式转换也可以应用(取决于您的要求,使用Type.IsAssignableFrom可能就足够了)。

第一步是检查 C# 语言规范中有关方法和事件的类型兼容性的规则。

于 2013-06-02T16:18:06.603 回答