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

EDIT:これらのオブジェクトの各々は、既にこれらのイベントを有する異なるクラスを継承するクラス(通常制御)のインスタンスです。

ご協力いただきありがとうございます。
Sam。

答えて

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に渡すことができます。

EDIT

それらのすべての間には一般的なタイプが存在しない場合、あなたはでき利用の反射:

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

+0

@SeriousSamPいくつか追加の詳細を追加しました。 – vcsjones

+0

私はあなたの反射方法にバリエーションを使用しています。 – SeriousSamP

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

関連する問題