以编程方式在VB.NET中添加事件处理程序(如果它不存在)

时间:2009-10-28 21:39:55

标签: vb.net events

我正在尝试为ASP.NET网页中的多个控件使用单个事件处理程序。我想在运行时添加事件处理程序,当且仅当它不存在时。在C#中,我会写如下:

if (myTextBox.OnTextChanged == null)
{
    myTextBox.OnTextChanged += DoTextChangingValidation;
}

同样,我知道我可以删除事件处理程序,如下所示:

if (myTextBox.OnTextChanged != null)
{
    myTextBox.OnTextChanged -= DoTextChangingValidation;
}

我知道如何在Visual Basic中添加和删除事件处理程序...但是如何确定如何检查它是否已经分配?

2 个答案:

答案 0 :(得分:7)

您无法在C#或Visual Basic中从对象外部执行此操作。一个事件基本上是两个访问者:addremove。如果您手动编码,它立即可见:

public event EventHandler Click
{
     add { ... }
     remove { ... }
}

这些方法成为add_Click(EventHandler)remove_Click(EventHandler)方法。即使您使用默认事件实现,

public event EventHandler Click;

它仍然没有什么不同,除了使用默认实现为您生成访问器,默认实现使用与事件同名的私有多播委托字段来存储这些处理程序。

这意味着两件事:

  1. 对于班级的客户,他们可以对事件做的唯一两件事是addremove处理程序,因为只有访问者被公开。列出当前注册的处理程序没有访问者

  2. 即使您对提供字段的事件使用默认实现,该字段仍然是私有的,因此除了来自同一类的方法之外,您无法访问它。如果您拥有代码权限,则可以使用反射,但请参阅#1了解为什么它不是一般解决方案。

  3. 这实际上是故意的。原因是:对象可能是共享的,而其他代码可能已为其事件注册了其处理程序。如果您可以访问处理程序列表,则可以自己调用它们,可能会违反合同,并以类所有者不想要的方式访问私有方法。

    如果你想要这样的事情,它需要在提供事件的类中完成 - 要么自己编写addremove来检查dupes,要么通过a公开私有字段属性。

答案 1 :(得分:3)

您无需在Visual Basic中为此方案执行检查。正常的删除语法很聪明,如果它已经消失,不会向你抛出异常。