2011-12-19 49 views
3

我想创建一个Sub,它可以接受一个对象并为其添加一个事件处理程序的负载,但该对象可以是任何一种具有这些事件的N个类型。我怎样才能做到这一点?如果我只是将它作为一个对象,如下所示AddHandler抱怨该对象不存在该事件。VB.Net - 将处理程序添加到未知类型的对象?

可以这样做吗?

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

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

感谢您的帮助,
山姆。

回答

10

您可能只想让inputObject具有所有这些成员的类型。例如,如果您使用的WinForms,这将是控制:

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传入的类型的代码,请使用接口。

+0

我想到这一点,但他们并不都有着一种遗传型。 – SeriousSamP 2011-12-19 18:31:51

+0

@SeriousSamP我添加了一些额外的细节。 – vcsjones 2011-12-19 18:51:48

+0

我在反射方法上使用变体,谢谢。 – SeriousSamP 2011-12-19 20:21:06

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 
+0

我无法使用接口方法,因为事件已经在父类中声明。请参阅编辑问题。 – SeriousSamP 2011-12-19 18:57:53

相关问题