检索方法中的调用方法名称

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

我在对象中有一个方法,可以从对象中的许多地方调用该方法。 有没有一种快速简便的方法来获取称为此流行方法的方法的名称。

伪代码示例:

public Main()
{
     PopularMethod();
}

public ButtonClick(object sender, EventArgs e)
{
     PopularMethod();
}

public Button2Click(object sender, EventArgs e)
{
     PopularMethod();
}

public void PopularMethod()
{
     //Get calling method name
}

PopularMethod()中,如果要从StackTrace调用它,我希望看到System.Reflection.MethodBase.GetCurrentMethod()的值...如果要从PopularMethod()调用PopularMethod(),我希望看到“ ButtonClick

我一直在查看System.Reflection.MethodBase.GetCurrentMethod(),但这无法获取调用方法。 我已经看过了StackTrace类,但我确实不喜欢每次调用该方法都运行整个堆栈跟踪。

7个解决方案
154 votes

在.NET 4.5 / C#5中,这很简单:

public void PopularMethod([CallerMemberName] string caller = null)
{
     // look at caller
}

编译器会自动添加调用方的名称; 所以:

void Foo() {
    PopularMethod();
}

将通过"Foo"

Marc Gravell answered 2019-11-08T17:58:05Z
71 votes

我认为如果不跟踪堆栈就无法完成。 但是,这样做非常简单:

StackTrace stackTrace = new StackTrace();
MethodBase methodBase = stackTrace.GetFrame(1).GetMethod();
Console.WriteLine(methodBase.Name); // e.g.

但是,我认为您真的必须停下来,问问自己是否有必要。

jason answered 2019-11-08T17:57:27Z
17 votes

这实际上非常简单。

public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod(); // as MethodBase
}

但是要小心,我对内联方法是否有效持怀疑态度。 您可以执行此操作以确保JIT编译器不会妨碍您。

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    var currentMethod = System.Reflection.MethodInfo
        .GetCurrentMethod();
}

获取调用方法:

[System.Runtime.CompilerServices.MethodImpl(
 System.Runtime.CompilerServices.MethodImplOptions.NoInlining)]
public void PopularMethod()
{
    // 1 == skip frames, false = no file info
    var callingMethod = new System.Diagnostics.StackTrace(1, false)
         .GetFrame(0).GetMethod();
}
John Leidegren answered 2019-11-08T17:58:43Z
5 votes

只需传入一个参数

public void PopularMethod(object sender)
{

}

IMO:如果对事件足够好,那么对此应该足够好。

Sruly answered 2019-11-08T17:59:16Z
4 votes

我经常发现自己想这样做,但是总是以重构我的系统设计为最终目标,所以我没有得到这种“拖尾狗”的反模式。 结果一直是更健壮的体系结构。

JonPen answered 2019-11-08T17:59:41Z
1 votes

虽然大多数definitley都可以跟踪堆栈并以这种方式解决,但我还是敦促您重新考虑您的设计。 如果您的方法需要了解某种“状态”,我会说只需创建一个枚举之类的东西,然后将其作为您PopularMethod()的参数即可。 遵循这些原则。 根据您发布的内容,跟踪堆栈将是IMO的过大杀伤力。

BFree answered 2019-11-08T18:00:06Z
0 votes

我认为您确实需要在下一帧上使用Reflection类,然后使用PopularMethod类。

尽管使用Reflection似乎是一件奇怪的事情。 如果您正在定义PopularMethod,则无法定义参数或某些东西来传递您真正想要的信息。 (或者放在基类之类的东西上……)

C. Dragon 76 answered 2019-11-08T18:00:39Z
translate from https://stackoverflow.com:/questions/615940/retrieving-the-calling-method-name-from-within-a-method