我创建一个基于事件的系统,其中一个类将提供一堆事件,另一个类及其成员方法可以附加到第一个类作为其事件处理程序,并且......我只想做这样的事情
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);
}
如果该方法与事件不兼容,它将引发异常,为了解决这个问题,我想在创建方法委托(delegate)之前创建一些检查,但是如何?
bool isMethodCompatibleToEvent(object methodTarget, MethodInfo mi,
object eventTarget, EventInfo ei)
{
// HOW ?
}
最佳答案
- 形参的数量必须相同。
- 形式参数的“refness”必须相同。 (从技术上讲,带有
out
参数的方法可以用于带有ref
参数的事件,反之亦然,但我不推荐这样做。) - 每个形式参数类型必须兼容。对于值类型,它们必须完全匹配。对于引用类型的形式参数,允许逆变。也就是说,如果您有一个事件处理程序要将长颈鹿传递给委托(delegate)人,则允许委托(delegate)人接受动物。
- 返回类型的“空性”必须相同;
void
仅匹配void
。 - 对于非 void 返回类型,值类型必须完全匹配。对于返回引用类型的事件处理程序,允许协变。也就是说,如果事件处理程序说它返回 Animal 并且委托(delegate)返回 Giraffe,那就没问题。
这些并不是全部规则,但足以处理绝大多数常见情况。
关于c# - 如何通过 C# 反射检查一个方法是否可以作为事件的处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16884662/