繁体   English   中英

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

[英]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引入一个新参数,让AB告诉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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM