我怎么知道哪种方法调用我的方法?

时间:2010-07-05 09:03:47

标签: c# .net c#-3.0

我有3个方法A(),B()和C(),A()和B()都调用C()。在方法C()中,我怎么知道它来自A()或B()?

9 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:8)

我不推荐这种方法 - 其他海报指出了更好的处理方法。但如果你真的需要知道谁给你打电话,而不改变C()的参数,你可以这样做:

static void A()
{
    C();
}

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

请注意,生成StackTrace有点贵。但是,这并不是什么大问题,除非你在代码中这么做,而且你经常打电话。

同样,你几乎肯定会找到一种更好的方式去做你想做的事情。

答案 2 :(得分: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();
}

如果您需要了解调试,只需使用调试器来逐步执行代码。

答案 3 :(得分:2)

答案 4 :(得分:1)

简单(干净)的方式是向C引入新参数,让AB告诉C谁调用它。

答案 5 :(得分:0)

只需在C()

中设置断点即可

答案 6 :(得分:0)

我原则上同意你在大多数情况下都不需要知道。

然而,这可能有用的一个用例是在调试某些信息的来源时,如果传递了错误的参数。

但是在这种情况下,最好抛出异常,记录异常并从中“恢复”。显然,这取决于调用方法的频率,因为创建异常总会有一些开销。如果你出于某种其他原因需要这样做,我建议你先看看你的设计。

如果你需要回调,我建议你让A和B都实现一个接口并传递A或B作为参数。接口可以有一个叫做回调的方法,C可以调用A或B.

答案 7 :(得分:0)

如果你试图找出“错误参数被传递”的位置,你只需要在该方法中设置一个条件断点,或者让VS中断将被抛出的异常,然后你可以检查调用堆栈(Debug Menu,Window,Call Stack)以查看此方法的整个调用者链(带参数)。

答案 8 :(得分:0)

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

如果您正在编写审计/日志框架,则非常有用,但实际上,YDNTN适用于此处。 此外,它在运行时耗费了大量资金。