c# - 如何通过 C# 反射检查一个方法是否可以作为事件的处理程序?

标签 c# events reflection methods delegates

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

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/

相关文章:

java - Scala 反射 : why getMethods can return the val members?

java - 如何从另一个类中获取方法的局部变量

c# - 如何解析 Unity 中的泛型类型

c# - jQuery 多重自动完成与 c#

powershell - 继续事件订阅,脚本执行powershell后

javascript - 查询为给定事件类型注册的事件监听器列表

azure - 语音和视频通话是否具有 JavaScript 事件监听器(例如 Azure 通信服务中的聊天事件监听器)?

Javascript 回溯

c# - 为什么当我传递参数时调度程序会这样?

将颜色着色一定百分比的 C# 算法