如何动态分配对象类型?

时间:2017-07-19 15:15:29

标签: vb.net

我试图遍历面板中的所有控件。一些控件作为我创建的类。在这些类中,我希望在删除对象时运行子例程。所以我试图创建一个临时对象,我可以用来运行该例程。

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赋值。

我该如何做到这一点?

2 个答案:

答案 0 :(得分: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因其他原因无效:您在枚举时无法从集合中删除项目。上面的方法将要删除的窗口存储在一个数组中。

答案 1 :(得分:0)

执行此操作的正确方法是使用控件Inherit的基类或基础或接口上控件Implementclose_me的接口。然后,您可以TryCast Controls的每个成员到基础或接口,如果成功,则在其上调用close_me。如果使用基类方法,您可能希望将其设为抽象(MustInherit),然后close_me将为MustOverride,具体取决于每个派生类型的行为是否应该不同。

e.g。假设您使用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