我正在尝试创建一个可以获取对象并为其添加大量事件处理程序的 Sub,但该对象可以是所有具有这些事件的 N 类型中的任何一种。我怎样才能做到这一点?如果我只是将它作为一个对象,如下所示 AddHandler 提示该事件对于对象不存在。
这可以做到吗?
Sub addHandlers(ByVal inputObject as object)
AddHandler inputObject.MouseDown, AddressOf HandleClick
AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub
编辑:这些对象中的每一个都是一个类的实例,该类继承了已经具有这些事件的不同类(通常是控件)。
谢谢你的帮助,
山姆。
最佳答案
您可能只想制作 inputObject
具有所有这些成员的类型。例如,如果您使用 WinForms,它将是 Control:
Sub addHandlers(ByVal inputObject As Control)
AddHandler inputObject.MouseDown, AddressOf HandleClick
AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub
或者如果是 WPF,请使用
UIElement
:Sub addHandlers(ByVal inputObject As UIElement)
AddHandler inputObject.MouseDown, AddressOf HandleClick
AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub
现在任何该类型的控件都可以传递到
addHandlers
.编辑 :
如果它们之间没有共同的类型,则可以使用反射:
Sub addHandlers(ByVal inputObject As Object)
Dim type = inputObject.GetType()
Dim handleClickDel = New MouseEventHandler(AddressOf HandleClick)
Dim handleUpDel = New MouseEventHandler(AddressOf HandleMouseUp)
type.GetEvent("MouseDown").AddEventHandler(inputObject, handleClickDel)
type.GetEvent("MouseUp").AddEventHandler(inputObject, handleUpDel)
End Sub
委托(delegate)类型仍然必须匹配。不过,这对我来说有点笨拙。如果可能,尝试为
addHandlers
创建不同的重载根据需要,并使用基本类型来避免创建其中的许多。如果拥有可以作为 inputOjbect
传入的类型的代码,使用接口(interface)。
关于.net - VB.Net - 将处理程序添加到未知类型的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8565671/