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

时间:2009-03-05 18:22:37

标签: c# reflection methods calling-convention

  

可能重复:
  How can I find the method that called the current method?

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

伪代码示例:

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()内我希望看到Main的值Main,如果它是从ButtonClick调用的...我希望看到“PopularMethod()”如果{ {1}}来自ButtonClick

我正在查看System.Reflection.MethodBase.GetCurrentMethod(),但这不会让我得到调用方法。我查看了StackTrace类,但每次调用该方法时我都不喜欢运行整个堆栈跟踪。

7 个答案:

答案 0 :(得分:143)

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

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

编译器会自动添加来电者姓名;这样:

void Foo() {
    PopularMethod();
}

将传入"Foo"

答案 1 :(得分:70)

我不认为没有跟踪堆栈就可以完成。但是,这样做很简单:

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

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

答案 2 :(得分:16)

这其实很简单。

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();
}

答案 3 :(得分:5)

只需传递一个参数

public void PopularMethod(object sender)
{

}

IMO:如果它对事件来说足够好,它应该足够好了。

答案 4 :(得分:4)

我经常发现自己想要做到这一点,但总是最终重构我的系统设计,所以我没有得到这种“尾巴摆动狗”的反模式。结果一直是一个更强大的架构。

答案 5 :(得分:1)

虽然你可以通过大多数definitley追踪堆栈并以此方式解决,但我会敦促你重新考虑你的设计。如果你的方法需要知道某种“状态”,我会说只需创建一个枚举或其他东西,并将其作为参数传递给PopularMethod()。沿着那条线的东西。根据您发布的内容,跟踪堆栈将是过度的IMO。

答案 6 :(得分:0)

我认为您确实需要在下一帧使用StackTrace课程,然后使用StackFrame.GetMethod()

虽然使用Reflection这似乎很奇怪。如果您要定义PopularMethod,则无法定义参数或其他内容来传递您真正想要的信息。 (或者加入基类或其他东西......)