[英]How can I know which method call my method?
我有3个方法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"
}
请注意,生成StackTrace有点昂贵。 但是,这并不是什么大问题,除非你在代码中这么做,而且你经常打电话。
同样,你几乎肯定会找到一种更好的方式来做你想做的事情。
方法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();
}
如果您需要了解调试,只需使用调试器来逐步执行代码。
您应该查看System.Diagnostics.StackFrame
类。 这里有一个例子: http : //www.csharp-examples.net/reflection-callstack/
简单(干净)的方法是向C
引入一个新参数,让A
和B
告诉C
谁调用它。
只需在C()中设置断点
我原则上同意你在大多数情况下都不需要知道。
然而,这可能有用的一个用例是在调试某些信息来自哪里时,如果传递了错误的参数。
但是在这种情况下,最好抛出异常,记录异常并从中“恢复”。 显然,这取决于调用方法的频率,因为创建异常总会有一些开销。 如果你出于某种其他原因需要这样做,我建议你先看看你的设计。
如果你需要回调,我建议你让A和B都实现一个接口并传递A或B作为参数。 接口可以有一个叫做回调的方法,C可以调用A或B.
在你试图找出“错误参数被传递”的位置的情况下,你只需要在该方法中设置一个条件断点,或者让VS中断抛出的异常,然后你可以检查调用堆栈( Debug Menu,Window,Call Stack)查看整个调用者链(带参数传递)给这个方法。
MethodBase callerMethod = new System.Diagnostics.StackFrame(1).GetMethod();
如果您正在编写审计/日志框架,这很有用,但实际上,YDNTN适用于此处。 而且它在运行时耗费了大量资金。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.