如何从未来的子中调用调用此子的子

How to call the sub that called this sub from a future sub

男孩哦男孩,这个标题令人困惑!

这最好用一个例子来解释。这就是我想要发生的事情。

Dim m as sub

Public sub alg1()
    call alg2()
End sub

Public sub alg2()
    m = alg1
    call alg3()
End sub

Public sub alg3()
    call m
End sub

所以我在 alg1 开始 运行 我的代码。 alg1 调用 alg2,它会记录谁调用它(我正在考虑 stackTrace.GetFrame(1).GetMethod().Name),然后将其存储在局部变量中,然后 alg2 继续调用 alg3。 alg3 调用存储在局部变量 m.

中的任何一个 sub

现在我的情况有点复杂,因为 alg1 与 alg2 处于不同的 class 中,但理论上我要做的就是交叉 class 调用子那是在运行时定义的。有没有办法存储这样的子?

这是一个运行上述想法的快速示例。

简化的控制台代码:

Public Module Module1

    Private Delegate Sub CoolDelegate()
    Private m As CoolDelegate

    Public Sub Main()
        Debug.WriteLine("Calling Alg1")
        Alg1()
    End Sub

    Private Sub Alg1()
        Debug.WriteLine("Alg1 Called")

        Debug.WriteLine("Calling Alg2")
        Alg2()
    End Sub

    Private Sub Alg2()
        Debug.WriteLine("Alg2 Called")

        m = New CoolDelegate(AddressOf Alg1)
        Debug.WriteLine("Calling Alg3")
        Alg3()
    End Sub

    Private Sub Alg3()
        Debug.WriteLine("Alg3 Called")

        Debug.WriteLine("Calling m")
        m()
    End Sub
End Module

输出:

Calling Alg1
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2
Alg2 Called
Calling Alg3
Alg3 Called
Calling m
Alg1 Called
Calling Alg2

(...重复直到堆栈溢出...)

也可以修改去掉局部私有变量。这是另一个版本...

Public Module Module1

    Private Delegate Sub CoolDelegate()

    Public Sub Main()
        Debug.WriteLine("Calling Alg1")
        Alg1()
    End Sub

    Private Sub Alg1()
        Debug.WriteLine("Alg1 Called")

        Debug.WriteLine("Calling Alg2")
        Alg2(AddressOf Alg1)
    End Sub

    Private Sub Alg2(Caller As CoolDelegate)
        Debug.WriteLine("Alg2 Called")

        Debug.WriteLine("Calling Alg3")
        Alg3(Caller)
    End Sub

    Private Sub Alg3(Caller As CoolDelegate)
        Debug.WriteLine("Alg3 Called")

        Debug.WriteLine("Calling Caller")
        Caller()
    End Sub
End Module

您的示例应该对 ActionAddressOf

稍作改动
Dim m As Action

Public Sub alg1()
    Call alg2()
End Sub

Public Sub alg2()
    m = AddressOf alg1
    Call alg3()
End Sub

Public Sub alg3()
    Call m()
End Sub

另一种选择是将其作为参数传递:

Public Sub alg2()
    alg3(AddressOf alg1)
End Sub

Public Sub alg3(m As action)
    m()
End Sub