将 EventHandler 添加到未知类型的对象?

Add EventHandler to object of unknown type?

我们在 运行 时间创建对象,因此在 运行 之前代码不知道它正在使用什么对象。我们想为在 运行 时间创建的每个 TextBox 添加一个事件处理程序。但是当我们尝试 AddHandler obj.Leave, AddressOf leaveControl 时,编译器不会 运行 程序,因为 "object doesn't have an event like Leave".

有没有办法向未知类型的对象添加事件处理程序?

谢谢:)

你知道它是一个文本框,所以投射它

AddHandler Ctype(obj,textbox).Leave, AddressOf leaveControl

如@Dom 所建议的那样,在没有看到创建控件的代码的情况下,您可以使用以下方法检查您正在创建的控件类型(作为仅查看文本框的示例);

Dim tb As TextBox = TryCast(obj, TextBox)

If tb IsNot Nothing
    AddHandler tb.Leave, AddressOf leaveControl
End If

同样,这只是一个示例,您一开始并不知道您正在做的事情的全部范围

VB.NET支持后期绑定编写动态代码。这适用于属性和方法,但不适用于事件。奇怪的限制,我不知道它的技术原因。简而言之,在 Basic 的早期版本中,事件绑定是基于方法名称的动态事件,它从来都不是必需的,我怀疑它与 WithEvents 关键字有关。

解决方法很简单,你需要使用Reflection。像这样:

    Dim obj As Object = New TextBox
    Dim evt = obj.GetType().GetEvent("Leave")
    evt.AddEventHandler(obj, New EventHandler(AddressOf leaveControl))

你想要的是这样的东西:

If obj.GetType() Is GetType(TextBox) then
   AddHandler obj.Leave, Address myNewRoutine
End If

请注意,您不能只拥有 TextBox,您需要再次使用 GetType。