如何在 C# 中获取调用方法 [重复]
Posted
技术标签:
【中文标题】如何在 C# 中获取调用方法 [重复]【英文标题】:How I can get the calling methods in C# [duplicate] 【发布时间】:2010-09-28 12:49:03 【问题描述】:可能重复:How can I find the method that called the current method?
我需要一种方法来知道 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();
【问题讨论】:
什么情况下需要知道? 这闻起来像是糟糕的编程习惯,请告诉我们您为什么要这样做? ;-) 将参数传递给 doSomething() 函数,具体取决于调用它的人。 是的,这通常不是一个好主意 我可以想到一个好主意的情况——如果你有共享代码负责一些横切关注点,例如日志记录,您可能希望此信息专门用于共享代码的输出 - 我在服务调用日志记录中使用这种做法,实用程序函数为服务调用设置安全性和日志记录,并将调用函数的身份用于日志记录和检查安全访问权限 【参考方案1】:来自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);
【讨论】:
我认为在发布版本中你不能依赖这个,因为 jit 编译器可以优化代码,所以名称可能不同。 但是我怎样才能得到以前的方法调用。更改 GetFrame() 为您提供调用堆栈中的所有方法。 这就是 (1) 的用途。您必须使用 [MethodImpl(MethodImplOptions.NoInlining)] 来确保您的方法不会被内联。 是的,但是应避免出于调试或日志记录以外的任何原因提取堆栈跟踪。这可能会导致糟糕的性能。 性能可能更差,但就我而言(最多连续调用 150 次),我什至无法测量差异。但是,我无法充分强调 Stormenet/Hans Passant 所说的不依赖于发布版本中的这一点。我花了两天的时间寻找一个错误,然后发现了这个问题。它几乎是多云的,因为您可以添加无意义的代码来阻止内联,并且您的代码将在调试模式下工作。【参考方案2】:您几乎肯定不想这样做。调用者永远不应该知道是谁在调用它。相反,应该将两个调用者之间的差异抽象为一个参数,并传递给被调用的方法:
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);
这样,如果你添加一个method3,它可以以一种方式或另一种方式做某事,而doSomething不会在意。
【讨论】:
您可能只想在输出一些调试信息时这样做 @Andrey:调试等总是一种特殊情况。如果 OP 对调试感兴趣,他可能应该这么说。在调试(跟踪、性能检测等)之外,这不是一个好主意。 @Downvoter:这个答案有什么问题? @JohnSaunders 这不是一个正确的答案。你没有得到方法名 @John Saunders 他只是表示这更适合作为评论而不是答案,因为它没有给他原始问题的实际答案。以上是关于如何在 C# 中获取调用方法 [重复]的主要内容,如果未能解决你的问题,请参考以下文章