我有三个方法A(), B()和C(), A()和B()都调用了C()。在方法C()中,我如何知道它是从A()还是B()调用的?
我有三个方法A(), B()和C(), A()和B()都调用了C()。在方法C()中,我如何知道它是从A()还是B()调用的?
你不需要这样做。一些方法应该执行特定的任务,它受到参数和对象属性的影响,而不是调用者。
我不建议采用这种方法-其他帖子指出了更好的处理方法。但是,如果你真的非常需要知道是谁调用了你,而不改变C()
的参数,你可以这样做:
static void A()
{
C();
}
static void C()
{
StackTrace st = new StackTrace();
Console.WriteLine(st.GetFrame(1).GetMethod().Name); // prints "A"
}
方法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();
}
如果您需要进行调试,只需使用调试器逐步执行您的代码即可。
简单(且清晰)的方法是向C
引入一个新参数,让A
和B
告诉C
谁调用了它。
只需在C()函数中设置断点
原则上,在大多数情况下,您不需要知道这个。
然而,在某些情况下,了解特定信息的来源可能是有用的,例如在调试时出现了错误参数的情况。
但是,在这种情况下,最好抛出异常、记录异常并从中“恢复”。显然,这取决于方法被调用的频率,因为创建异常总会带来一些开销。如果您需要出于其他原因执行此操作,则建议您首先查看设计。
如果您需要回调,我建议您使A和B都实现一个接口,并将A或B作为参数传递。该接口可以有一个名为回调的方法,C可以调用A或B。
MethodBase callerMethod = new System.Diagnostics.StackFrame(1).GetMethod();
如果你正在编写审计/日志框架,这将非常有用,但实际上,YDNTN适用于此处。 而且它在运行时成本高昂。