给未知类型的对象添加eventandler



我们在运行时创建对象,所以在运行代码之前不知道它正在处理什么对象。我们想为每个在运行时创建的TextBox添加一个事件处理程序。但是当我们尝试AddHandler obj.Leave, AddressOf leaveControl时,编译器不会运行程序,因为"对象没有像Leave这样的事件"。

是否有办法将事件处理程序添加到未知类型的对象?

谢谢:)

VB。NET支持后期绑定来编写动态代码。对于属性和方法,可以很好地工作,但是对于事件,不能。奇怪的限制,我不知道技术上的原因。在早期的Basic版本中,事件绑定是基于方法名的动态绑定,我怀疑这与WithEvents关键字有关。

解决方法很简单,你需要使用反射。这样的:

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

你知道这是一个文本框,所以对它进行强制转换

AddHandler Ctype (obj,文本框)。

不需要查看创建控件的代码,正如@Dom所建议的那样,您可以使用以下代码检查正在创建的控件的类型(仅作为查看文本框的示例);

Dim tb As TextBox = TryCast(obj, TextBox)
If tb IsNot Nothing
    AddHandler tb.Leave, AddressOf leaveControl
End If

再次强调,这只是一个例子,在你不知道你在做什么的情况下

您需要的内容是:

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

注意,你不能只使用TextBox,你需要再次使用GetType。

最新更新