当前位置 : 主页 > 编程语言 > c语言 >

VB.Net – 将Handler添加到未知类型的对象?

来源:互联网 收集:自由互联 发布时间:2021-06-24
我正在尝试创建一个Sub,它可以获取一个对象并为其添加一堆事件处理程序,但该对象可以是所有具有这些事件的N种类型中的任何一种.我怎样才能做到这一点?如果我只是将它作为一个
我正在尝试创建一个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 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

但是委托类型仍然必须匹配.不过,这对我来说有点笨拙.如果可能,尝试根据需要为addHandler创建不同的重载,并使用基类型来避免创建其中的许多重载.如果拥有可以作为inputOjbect传入的类型的代码,请使用接口.

网友评论