可能重复:
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
类,但每次调用该方法时我都不喜欢运行整个堆栈跟踪。
答案 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
,则无法定义参数或其他内容来传递您真正想要的信息。 (或者加入基类或其他东西......)