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

时间:2011-12-19 18:26:08

标签: .net wpf vb.net events types

我正在尝试创建一个Sub,它可以获取一个对象并为其添加一堆事件处理程序,但该对象可以是所有具有这些事件的N种类型中的任何一种。我怎样才能做到这一点?如果我将它作为一个Object,如下所示,AddHandler会抱怨对象不存在该事件。

可以这样做吗?

Sub addHandlers(ByVal inputObject as object)
    AddHandler inputObject.MouseDown, AddressOf HandleClick
    AddHandler inputObject.MouseUp, AddressOf HandleMouseUp
End Sub

编辑:这些对象中的每一个都是继承已有这些事件的不同类(通常是控件)的类的实例。

感谢您的帮助,
萨姆。

2 个答案:

答案 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