我们在运行时创建对象,所以在运行代码之前不知道它正在处理什么对象。我们想为每个在运行时创建的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。