我有3个方法A(),B()和C(),A()和B()都调用C()。在方法C()中,我怎么知道它来自A()或B()?
答案 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
引入新参数,让A
和B
告诉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适用于此处。 此外,它在运行时耗费了大量资金。