我该如何知道是哪个方法调用了我的方法?

3

我有三个方法A(), B()和C(), A()和B()都调用了C()。在方法C()中,我如何知道它是从A()还是B()调用的?


为什么不通过查看代码来确定是哪个方法在调用它呢? - Neil Knight
方法C()使用方法名A和B作为反射参数来调用远程服务,在客户端上的方法名始终与服务器上的方法名相同,如果我能做到这一点,将有助于我们团队减少按键次数。 - Anonymous
减少按键次数是创建这样一个维护混乱的非常(非常)糟糕的动机。 - H H
阅读了您的所有评论后,我决定使用参数进行指示。谢谢。 - Anonymous
9个回答

11

你不需要这样做。一些方法应该执行特定的任务,它受到参数和对象属性的影响,而不是调用者。


8

我不建议采用这种方法-其他帖子指出了更好的处理方法。但是,如果你真的非常需要知道是谁调用了你,而不改变C()的参数,你可以这样做:

static void A()
{
    C();
}

static void C()
{
    StackTrace st = new StackTrace();
    Console.WriteLine(st.GetFrame(1).GetMethod().Name); // prints "A"
}

请注意,生成StackTrace的成本相对较高。不过,除非您在非常频繁地调用代码,否则这并不是什么大问题。
再次强调,您几乎肯定会找到更好的方法来完成您想要做的任何事情。

3

方法C()不应该需要知道是哪个方法调用了它。如果您正在处理流程逻辑,需要重新考虑您编写代码的方式。

假设有某些有效原因需要知道调用C()的方法,我会创建两个“包装器”方法:C_From_A()和C_From_B()。任何特定于调用方法的逻辑都应移动到新方法中,而通用代码则留在C()方法中,并从两个新方法中调用:

public void C()
{
   // Common Code goes here
}

public void C_From_A()
{
    // Code only to be called from A() goes here.

    C();  // Common code executed
}

public void C_From_B()
{
    // Code only to be called from B() goes here.

    C();  // Common code executed
}


public void A()
{
    // Other code goes here

    C_From_A();
}

如果您需要进行调试,只需使用调试器逐步执行您的代码即可。


2

1

简单(且清晰)的方法是向C引入一个新参数,让AB告诉C谁调用了它。


0

只需在C()函数中设置断点


0

原则上,在大多数情况下,您不需要知道这个。

然而,在某些情况下,了解特定信息的来源可能是有用的,例如在调试时出现了错误参数的情况。

但是,在这种情况下,最好抛出异常、记录异常并从中“恢复”。显然,这取决于方法被调用的频率,因为创建异常总会带来一些开销。如果您需要出于其他原因执行此操作,则建议您首先查看设计。

如果您需要回调,我建议您使A和B都实现一个接口,并将A或B作为参数传递。该接口可以有一个名为回调的方法,C可以调用A或B。


0
如果你想找出哪个“错误参数被传递”的问题,你只需要在该方法中设置一个条件断点或让VS在抛出异常时中断,然后你就可以检查调用堆栈(调试菜单、窗口、调用堆栈)来查看整个调用链(带有传递的参数)到这个方法。

0
MethodBase callerMethod = new System.Diagnostics.StackFrame(1).GetMethod();

如果你正在编写审计/日志框架,这将非常有用,但实际上,YDNTN适用于此处。 而且它在运行时成本高昂。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接