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

可能重复:
我怎样才能find调用当前方法的方法?

我有一个对象的方法在对象内的多个地方被调用。 有没有一个简单快捷的方法来获得这个方法的名字,这个方法叫做这个stream行的方法。

伪代码示例:

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 ”,如果从ButtonClick调用ButtonClick PopularMethod()

我在看System.Reflection.MethodBase.GetCurrentMethod()但不会让我的调用方法。 我已经看了StackTrace类,但是我真的不喜欢每次调用这个方法时运行整个堆栈跟踪。

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

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

不过,我想你真的不得不停下来问问自己这是否有必要。

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

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

编译器自动添加调用者的名字; 所以:

 void Foo() { PopularMethod(); } 

将通过"Foo"

这其实很简单。

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

只需传入一个参数

 public void PopularMethod(object sender) { } 

国际海事组织(IMO):如果事件足够好的话,应该足够好。

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

虽然你可以大多数definitley跟踪堆栈,并找出这种方式,我会敦促你重新考虑你的devise。 如果你的方法需要知道某种“状态”,我会说只是创build一个枚举或东西,并把它作为一个参数到你的PopularMethod()。 沿着这些线的东西。 根据你发布的内容,跟踪堆栈将是过度的IMO。

我认为你需要在下一帧使用StackTrace类,然后使用StackFrame.GetMethod()

虽然这似乎是一个奇怪的事情使用Reflection 。 如果你正在定义PopularMethod ,那么就不能去定义一个参数或者某个东西来传递你真正想要的信息。 (或放在一个基类或其他…)