如何检查方法是否可以通过C#反射处理事件?

时间:2013-06-02 16:12:48

标签: c# events reflection methods delegates

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

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 ?
}

2 个答案:

答案 0 :(得分:2)

  • 形式参数的数量必须相同。
  • &#34; refness&#34;形式参数必须相同。 (从技术上讲,带有out参数的方法可用于带有ref参数的事件,反之亦然,但我不推荐它。)
  • 每个形式参数类型必须兼容。对于值类型,它们必须完全匹配。对于参考类型的形式参数,允许逆变。也就是说,如果您有一个将Giraffe传递给委托的事件处理程序,则委托人可以使用Animal。
  • &#34; voidness&#34;返回类型必须相同; void仅匹配void
  • 对于非void返回类型,值类型必须完全匹配。对于返回引用类型的事件处理程序,允许协方差。也就是说,如果事件处理程序说它返回Animal并且委托返回Giraffe,那很好。

这些并非所有规则,但它们足以应对绝大多数常见案例。

答案 1 :(得分:0)

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

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

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

相关问题