2011-12-19 48 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

相關問題