我正在尝试对 ASP.NET 网页中的多个控件使用单个事件处理程序。当且仅当事件处理程序尚不存在时,我想在运行时添加事件处理程序。在 C# 中,我将如下所示编写:
if (myTextBox.OnTextChanged == null)
{
myTextBox.OnTextChanged += DoTextChangingValidation;
}
同样,我知道我可以删除事件处理程序,如下所示:
if (myTextBox.OnTextChanged != null)
{
myTextBox.OnTextChanged -= DoTextChangingValidation;
}
我知道如何在 Visual Basic 中添加和删除事件处理程序...但是我如何弄清楚如何检查它是否已分配?
无论是在 C# 中还是在 Visual Basic 中,都无法从对象外部执行此操作。一个事件基本上是两个访问器:add
and remove
。如果您手动编码,这将立即可见:
public event EventHandler Click
{
add { ... }
remove { ... }
}
这些成为add_Click(EventHandler)
and remove_Click(EventHandler)
方法。即使您使用默认事件实现,
public event EventHandler Click;
它仍然没有什么不同,只是访问器是使用默认实现为您生成的,该实现使用与事件同名的私有多播委托字段来存储这些处理程序。
这意味着两件事:
对于班级的客户来说,他们对事件唯一能做的两件事是add
or remove
处理程序,因为只有访问器被公开。没有访问器来列出当前注册的处理程序
即使您使用事件的默认实现(它提供了一个字段),该字段仍然是私有的,因此您无法访问它,除非从同一类的方法内部访问。如果您有代码权限,则可以使用反射,但请参阅#1 了解为什么它不是通用解决方案。
这实际上是故意的。原因是这样的:该对象可能是共享的,并且其他代码可能已经为其事件注册了其处理程序。如果您有权访问处理程序列表,您就可以自己调用它们,这可能会违反合同,并以类所有者不希望的方式访问私有方法。
如果您想要这种事情,则需要在提供事件的类中完成 - 要么编写您自己的add
and remove
检查是否存在欺骗,或通过属性公开私有字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)