递归循环获取对象的父对象

Recursive loop to get the parent of an object

我正在尝试使用以下函数获取元素的父对象。

'Recursive until the parent control is found
Public Function __GET_PARENT(ByVal current As Object, ByVal pType As Type)
    Dim nextParent As Object = current.Parent
    If Not nextParent Is Nothing AndAlso Not TypeOf nextParent Is pType Then Return __GET_PARENT(nextParent, pType)
    Return nextParent
End Function

例如,如果我将一个名为 textbox_1 的对象作为当前参数传递,并将面板作为上述函数的 pType 参数,它应该 return 实际的面板对象。

在比较 TypeOf nextParent is pType 时出现错误,提示未定义 pType。

Is 运算符将类型作为第二个参数,而不是 Type 对象。

获取控件的类型并与 Type 对象进行比较:

... AndAlso nextParent.GetType() <> pType Then ...

旁注:考虑 simpy 使用循环而不是递归。

编辑:

要同时查找继承自该类型的父控件,您可以使用 IsSubclassOf method:

... AndAlso nextParent.GetType() <> pType AndAlso Not nextParent.GetType().IsSubclassOf(pType) Then ...

我宁愿将对象更改为控件,然后添加一个循环来查看所有级别,如下所示:

Public Function __GET_PARENT(ByVal current As Control, ByVal pType As Type) As Control
    Dim parent As Control = current.Parent
    While parent IsNot Nothing
        If pType.IsAssignableFrom(parent.GetType()) Then
            Return parent
        End If

        parent = parent.Parent
    End While
    Return Nothing
End Function

我的 VB 有点生疏,但这应该可以解决问题。

否则您可以使用泛型,这样您的 return 类型就不是对象/控件,而是面板或您要查找的任何类型。那么你可以这样做:

Public Function __GET_PARENT(Of T As Control)(ByVal current As Control) As T
    Dim parent = current.Parent
    If (parent Is Nothing) Then
        Return Nothing
    End If
    If GetType(T).IsAssignableFrom(parent.GetType()) Then
        Return CType(parent, T)
    End If
    Return __GET_PARENT(Of T)(parent)
End Function

然后简单调用如下:

Dim ctrl As Panel = __GET_PARENT(Of Panel)(Button1)