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