我如何在C#中获取调用方法

ecl*_*eel 21 c# reflection

可能重复:
如何找到调用当前方法的方法?

我需要一种方法来了解C#中调用方法的名称.

例如:

private void doSomething()
{
// I need to know who is calling me? (method1 or method2).

// do something pursuant to who is calling you?
} 

private void method1()
{
 doSomething();
}

private void method2()
{
 doSomething();
}
Run Code Online (Sandbox Code Playgroud)

And*_*son 56

来自http://www.csharp-examples.net/reflection-calling-method-name/

using System.Diagnostics;

// get call stack
StackTrace stackTrace = new StackTrace();

// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);
Run Code Online (Sandbox Code Playgroud)

  • 我认为在发布版本中你不能依赖于此,因为jit编译器可以优化代码,因此名称可能不同. (7认同)
  • 这就是(1)的用途.您必须使用[MethodImpl(MethodImplOptions.NoInlining)]来确保您的方法不被内联. (5认同)
  • 是的,但是应该避免出于调试或记录之外的任何原因提取堆栈跟踪.这可能会导致糟糕的表现. (5认同)

Joh*_*ers 7

你几乎肯定不想这样做.呼叫者永远不应该知道谁在呼叫它.相反,两个调用者之间的差异应该被抽象为一个参数,并传递给被调用的方法:

private void doSomething(bool doItThisWay)
{
    if (doItThisWay)
    {
        // Do it one way
    }
    else
    {
        // Do it the other way
    }
}

private void method1()
{
    doSomething(true);
}

private void method2()
{
    doSomething(false);
}
Run Code Online (Sandbox Code Playgroud)

这样,如果你添加一个方法3,它可以以某种方式做某事,而doSomething也不会关心.

  • 您可能只想在输出某些调试信息时才这样做 (3认同)
  • @Andrey:调试等等总是一个特例.如果OP对调试感兴趣,他应该这样说.在调试(跟踪,性能检测等)之外,这不是一个好主意. (2认同)