2017-07-19 125 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

要做到這一點的正確方法是使用您的控件Inherit的基類或控件Implementclose_me在基礎或接口上的接口。然後,您可以將TryCast的每個成員Controls添加到基礎或界面,如果成功,請致電close_me。如果使用基類方法,您可能希望將其抽象化(MustInherit),然後close_me將爲MustOverride,具體取決於每種派生類型中的行爲是否應該不同。

例如假設你使用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

這聽起來像是會起作用,但我得到了「Type ICloseable is not defined。」。我在哪裏定義?我的類繼承Panel作爲基類型。 – user2721815

+0

我將我的類設置爲繼承Panel,然後在類中實現ICloneable。將上面的代碼更改爲ICloneable而不是ICloseable適用於我的目的。謝謝。 – user2721815

+0

@ user2721815如果'ICloneable'具有您想要的方法,那很好。但是如果你真的想'close_me',那麼你需要創建你自己的控件也可以實現的界面。 – Craig

1

Object.GetType不是你想要的,它返回包含該類型元數據的對象的實例,通常用於反射。

什麼是你想要的實際類型?它必須有一個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

然後那些控件應該用至少一種方法實現相同的接口(f.e。IClosable)close_me –

+0

問題是我將不得不使用上面的方法專門分配一個類型。例如(YourWindowType)將需要(Of User_page)或(Of Admin_page)。我會有很多類型,我不想爲每個類型進行測試。我只想知道控件是什麼類型,然後將相同的類型分配給一個變量,我可以用它來調用子例程。 – user2721815