.net - EventInfo.GetRaiseMethod() 始终为空

标签 .net events reflection

我有:

event EventHandler MyEvent;

MyEvent += new EventHandler(someHandler);

if(this.GetEvent("MyEvent").GetRaiseMethod() == null)
{
  // Always true...
}

但为什么?添加处理程序后,不应该 GetRaiseMethod()设置为 someHandlerMethodInfo ?

最佳答案

这是 C# 的一个怪癖,它不支持 raise 访问器。仅添加和删除。其他 .NET 语言,如 VB.NET、F# 和 C++/CLI 确实支持它们,并且在 CLI 规范中对其进行了很好的定义,在该规范中命名为“fire”。

很难解释为什么 C# 团队跳过了它,我从来没有见过一个很好的解释。纯粹的猜测:这可能与他们希望避免为没有人订阅的事件构建事件参数的成本有关。在 GUI 框架中很常见。有点损失,C# 程序员编写标准 raise 事件模式以及在忘记检查 null 时诊断 NRE 肯定已经浪费了数十万小时。 C# v6 中的 elvis 运算符 ( ?. ) 终于让它变得更容易了。

无论如何,如果您反射(reflect)用 C# 编写的代码,您将永远不会从 GetRaiseMethod() 获得任何内容。但是,当它用 VB.NET、F# 或 C++/CLI 编写时,您总是会得到一个非空值。如果您需要通过反射引发事件,则必须挖掘支持委托(delegate)变量,这可能会很痛苦。如果使用了自动生成的添加/删除访问器,则支持变量与事件具有相同的名称,您可以使用 Type.GetField() 检索它,使用 BindingFlags.NonPublic | BindingFlags.Instance。

关于.net - EventInfo.GetRaiseMethod() 始终为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14885325/

相关文章:

c# - 如何在运行时加载程序集并创建类实例?

c# - 在与请求匹配的 Controller 上未找到任何操作

c# - WPF CollectionViewSource 的组属性

c# - 如何通过 WebClient 请求传递信息以识别加载的对象?

java - 无法无异常地修改私有(private)最终静态变量

c# - 复合属性

c# - 哪个是比较两位数字的最有效方法?

.net - 使用我的本地 SSL 证书配置端口

c++ - 用 C++ 编写一个简单的事件调度程序——如何避免自引用和递归问题?

javascript - 在 HTML5 WebAudio 中如何知道声音是否停止或播放完毕?