我创建了一个基于事件的系统,其中一个类将提供一堆事件,另一个类及其成员方法可以作为其事件处理程序附加到第一个类,并且......我只想做类似这样的事情< / 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 ?
}
答案 0 :(得分:2)
out
参数的方法可用于带有ref
参数的事件,反之亦然,但我不推荐它。)void
仅匹配void
。这些并非所有规则,但它们足以应对绝大多数常见案例。
答案 1 :(得分:0)
您需要比较方法和委托的签名(定义事件的类型):如果它们匹配,则可以将方法组合到事件中。
参数和返回类型的完全匹配显然最简单,但也考虑也可以应用隐式转换(根据您的要求使用Type.IsAssignableFrom
可能就足够了。)
检查C#语言规范,了解有关方法和事件的类型兼容性的规则,这是第一步。