2017-07-19 7 views
1

パネル内のすべてのコントロールをループしています。いくつかのコントロールは私が作成したクラスです。これらのクラスでは、オブジェクトが削除されたときにサブルーチンを実行します。だから、私はそのルーチンを実行するために使用できる一時的なオブジェクトを作成しようとしています。どのようにオブジェクトタイプを動的に割り当てるのですか?

For Each window As Control In main_window.Controls 
    If window.Handle = hdl Then 
    Dim temp_window as window.getType() 
    temp_window.close_me() 
    main_window.Controls.Remove(window) 
    End If 
Next 

ただし、getTypeの割り当てはできません。

どうすればこの問題を解決できますか?

+0

'close_me()'とは何ですか? – inquisitive

+0

私が作成したクラスのために実行したいサブルーチンです。コントロールが削除される前に、いくつかのクリーンアップ作業を行います。 "Public Shared Sub close_me()"に設定されています – user2721815

答えて

0

これを行うための正しい方法は、基本またはインターフェイス上close_meとあなたのコントロールInheritやあなたのコントロールImplementインタフェースの基本クラスを使用することです。次に、ベースまたはインターフェイスへのControlsの各メンバーTryCastを実行し、成功した場合はclose_meを呼び出します。基本クラスのアプローチを使用する場合は、抽象的な(MustInherit)にし、close_meMustOverrideになります(それぞれの派生型で動作が異なる必要があるかどうかによって異なります)。

ICloseableを使用すると仮定すると、

Interface ICloseable 
    Sub close_me() 
End Interface 

'... 

For Each window As Control In main_window.Controls 
    If window.Handle = hdl Then 
     Dim asCloseable = TryCast(window, ICloseable) 
     If asCloseable IsNot Nothing Then 
      asCloseable.close_me() 
     EndIf 
    EndIf 
Next 
+0

これはうまくいくように聞こえますが、「タイプICloseableが定義されていません」と表示されています。それはどこで定義するのですか?私のクラスはPanelを基本型として継承しています。 – user2721815

+0

Panelを継承するようにクラスを設定してから、そのクラスにICloneableを実装します。上記のコードをICloseableの代わりにICloneableに変更することは私の目的のために働きます。ありがとう。 – user2721815

+0

@ user2721815 'ICloneable'があなたが望むメソッドを持っているなら、それは問題ありません。しかし、本当に 'close_me'が必要な場合は、あなたのコントロールが実装する独自のインターフェースを作成する必要があります。 – Craig

1

Object.GetTypeは、通常、反射に使用されるそのタイプのメタデータを含むオブジェクトのTypeインスタンスを返します。

実際のタイプは何ですか?それはclose_meメソッドを持っている必要があります。あなたはOfTypeを使用することができます。

Dim windowsToClose = main_window.Controls.OfType(Of YourWindowType)(). 
    Where(Function(w) w.Handle = hdl). 
    ToArray() 

For Each window In windowsToClose 
    window.close_me() 
    main_window.Controls.Remove(window) 
Next 

あなたFor Each別の理由で動作しません:あなたはそれを列挙している間、あなたは、コレクションから項目を削除することはできません。上のアプローチは、削除するウィンドウを配列に格納します。

+0

ただし、コントロールの種類がすべて同じではありません。だから私はオブジェクトの種類がわからないので、すべての可能な型を反復しない限り、それを割り当てる方法はわかりません。 – user2721815

+0

これらのコントロールでは、少なくとも1つのメソッドclose_meを使用して同じインターフェイス(ICeosable)を実装する必要があります –

+0

問題は、上記のメソッドを使用して型を割り当てなければならないことです。たとえば、Of YourWindowTypeは(Of User_page)または(Of Admin_page)にする必要があります。私は多くの種類がありますし、それぞれをテストする必要はありません。私は、コントロールの型が何であるかを知り、同じ型を変数に代入してサブルーチンを呼び出すことができます。 – user2721815

関連する問題