我正在尝试创建一个Sub,它可以获取一个对象并为其添加一堆事件处理程序,但该对象可以是所有具有这些事件的N种类型中的任何一种。我怎样才能做到这一点?如果我将它作为一个Object,如下所示,AddHandler会抱怨对象不存在该事件。
可以这样做吗?
Sub addHandlers(ByVal inputObject as object)
AddHandler inputObject.MouseDown, AddressOf HandleClick
AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub
编辑:这些对象中的每一个都是继承已有这些事件的不同类(通常是控件)的类的实例。
感谢您的帮助,
萨姆。
答案 0 :(得分:11)
您可能只想让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
委托类型必须仍然匹配。不过,这对我来说有点笨拙。如果可能,尝试根据需要为addHandlers
创建不同的重载,并使用基类型来避免创建其中的许多重载。如果拥有可以作为inputOjbect
传入的类型的代码,请使用接口。
答案 1 :(得分:1)
如果它们并非都从相同的类型继承,那么您可能需要在每个类型上实现一个接口,以使它们具有通用性。
然后使用事件的接口定义并在每个对象的现有事件上实现它。
接口:
Public Interface MyInterface
Event PropertyChanged(ByVal sender As Object, ByVal e As EventArgs)
End Interface
具有事件的对象:
Public WhateverClass
Implements MyInterface
Public Event PropertyChanged(ByVal sender As Object, ByVal e As EventArgs) Implements IMyInterface
End Class
需要处理程序的类:
Public Class SomeOtherClass
Public Sub AddHandlers (ByVal inputObject as MyInterface)
AddHandler inputObject.PropertyChanged, AddressOf PropertyChanged
End Sub
Public Sub PropertyChanged(ByVal sender as Object, ByVal e as EventArgs)
'Do Stuff
End Sub
End Class