我试图遍历面板中的所有控件。一些控件作为我创建的类。在这些类中,我希望在删除对象时运行子例程。所以我试图创建一个临时对象,我可以用来运行该例程。
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 :(得分: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
的基类或基础或接口上控件Implement
与close_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