我正在尝试创建一个Sub,它可以获取一个对象并为其添加一堆事件处理程序,但该对象可以是所有具有这些事件的N种类型中的任何一种.我怎样才能做到这一点?如果我只是将它作为一个Object,如下所示,AddHandler会抱怨Object不存在该事件.
可以这样做吗?
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 HandleMouseUp End Sub
或者如果是WPF,请使用UIElement:
Sub addHandlers(ByVal inputObject As UIElement) AddHandler inputObject.MouseDown,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
但是委托类型仍然必须匹配.不过,这对我来说有点笨拙.如果可能,尝试根据需要为addHandler创建不同的重载,并使用基类型来避免创建其中的许多重载.如果拥有可以作为inputOjbect传入的类型的代码,请使用接口.