从被调用函数中获取调用函数名[重复]

Posted

技术标签:

【中文标题】从被调用函数中获取调用函数名[重复]【英文标题】:Get the calling function name from the called function [duplicate] 【发布时间】:2010-11-21 13:29:07 【问题描述】:

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

如何从 C# 中的被调用函数中获取调用函数名?

【问题讨论】:

重复***.com/questions/171970/… 这是一个骗局,但由于术语不同,可能值得保持开放 - 可能对人们搜索有所帮助。 @Keith:是的,出于这个原因,我们通常会尝试在以明显不同的方式提出重复问题时保留重复的问题 - 这就是为什么关闭它们会自动在顶部添加链接,所以未来的搜索者可以更快地找到答案。 【参考方案1】:
new StackFrame(1, true).GetMethod().Name

请注意,在发布版本中,编译器可能会内联被调用的方法,在这种情况下,上面的代码将返回调用者的调用者,因此为了安全起见,您应该使用以下内容装饰您的方法:

[MethodImpl(MethodImplOptions.NoInlining)]

【讨论】:

请注意,以这种方式遍历堆栈会对性能造成相当大的影响。我强烈建议在使用之前寻找不涉及堆栈遍历的解决方案。 这个答案实际上比重复问题中的答案更好,因为提到了 MethodImpl 属性。 我知道这是一个骗子并标记为 .net 3.5,但为了帮助首先偶然发现这个的搜索者(比如我),最好在你的回答中指出在 C# 5.0 中你现在可以使用调用者信息,如:visualstudiomagazine.com/articles/2012/11/01/… @acarlon 感谢您的链接!甚至没有意识到这些属性的存在。 如果fNeedFileInfofalse 而不是true 会更快(StackFrame constructor 的第二个参数,刚刚尝试了数千次调用)。【参考方案2】:

这将为您提供您所在方法的名称:

string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name;

谨慎使用,因为可能会影响性能。

To get callers:
StackTrace trace = new StackTrace();
int caller = 1;

StackFrame frame = trace.GetFrame(caller);

string callerName = frame.GetMethod().Name;

这使用堆栈遍历来获取方法名称。 caller 的值是调用堆栈要走多远。小心不要走得太远。

【讨论】:

我需要哪个方法调用当前方法。 从堆栈跟踪中获取调用者姓名的方式,会影响性能吗?

以上是关于从被调用函数中获取调用函数名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从被调用的函数调用函数时 VBA byref 参数类型不匹配

如何覆盖特征函数并从被覆盖的函数中调用它?

从被 CORS 阻止的 Firebase 托管代码调用 Firebase 函数

如何在具有相同函数名的派生类中调用基类的函数[重复]

获取函数名到字符串[重复]

从Python中存储的字符串调用函数[重复]