如何从代码中获得当前方法的名称

我知道你能做到

this.GetType().FullName

得到

My.Current.Class

但我该打什么电话

My.Current.Class.CurrentMethod
446090 次浏览
using System.Diagnostics;
...


var st = new StackTrace();
var sf = st.GetFrame(0);


var currentMethodName = sf.GetMethod();

或者,如果你想要一个helper方法:

[MethodImpl(MethodImplOptions.NoInlining)]
public string GetCurrentMethod()
{
var st = new StackTrace();
var sf = st.GetFrame(1);


return sf.GetMethod().Name;
}

更新到@ stussmith。

从方法内部调用System.Reflection.MethodBase.GetCurrentMethod().Name

你也可以使用MethodBase.GetCurrentMethod(),这将抑制JIT编译器内联使用它的方法。


更新:

这个方法包含一个特殊的枚举StackCrawlMark,根据我的理解,它将向JIT编译器指定当前方法不应该内联。

这是我对与SSCLI中出现的枚举相关的注释的解释。评论如下:

// declaring a local var of this enum type and passing it by ref into a function
// that needs to do a stack crawl will both prevent inlining of the calle and
// pass an ESP point to stack crawl to
//
// Declaring these in EH clauses is illegal;
// they must declared in the main method body

从c#版本6开始,你可以简单地调用:

string currentMethodName = nameof(MyMethod);

在c#版本5和。net 4.5中,你可以使用[CallerMemberName]属性来让编译器自动生成一个字符串参数中调用方法的名称。其他有用的属性是[CallerFilePath],用于让编译器生成源代码文件路径,[CallerLineNumber]用于获取进行调用的语句在源代码文件中的行号。


在此之前,还有一些更复杂的方法来获取方法名,但要简单得多:

void MyMethod() {
string currentMethodName = "MyMethod";
//etc...
}

尽管重构可能不会自动修复它。

如果你完全不关心使用Reflection的(相当大的)代价,那么这个helper方法应该是有用的:

using System.Diagnostics;
using System.Runtime.CompilerServices;
using System.Reflection;
//...


[MethodImpl(MethodImplOptions.NoInlining)]
public static string GetMyMethodName() {
var st = new StackTrace(new StackFrame(1));
return st.GetFrame(0).GetMethod().Name;
}

这样不行吗?

System.Reflection.MethodBase.GetCurrentMethod()

返回一个表示当前执行方法的MethodBase对象。

名称空间:系统。反射

程序集:mscorlib(在mscorlib.dll中)

http://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod.aspx

嗯,System.Reflection.MethodBase.GetCurrentMethod().Name不是一个很好的选择,因为它只显示方法名而不显示其他信息。

就像string MyMethod(string str)一样,上面的属性只返回MyMethod,这是不够的。

最好使用System.Reflection.MethodBase.GetCurrentMethod().ToString(),它将返回整个方法签名…

我认为获得全名的最好方法是:

 this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name;

或者试试这个

string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);