- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有:
event EventHandler MyEvent;
MyEvent += new EventHandler(someHandler);
if(this.GetEvent("MyEvent").GetRaiseMethod() == null)
{
// Always true...
}
GetRaiseMethod()
设置为
someHandler
的
MethodInfo
?
最佳答案
这是 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/
我有: event EventHandler MyEvent; MyEvent += new EventHandler(someHandler); if(this.GetEvent("MyEvent"
我是一名优秀的程序员,十分优秀!