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

我知道你可以做

this.GetType().FullName 

编辑@Pasi Savolainen提供

要得到

My.Current.Class

但是,我可以打电话来得到什么

My.Current.Class.CurrentMethod

 StackTrace st = new StackTrace (); StackFrame sf = st.GetFrame (0); MethodBase currentMethodName = sf.GetMethod (); 

或者,如果你想有一个帮手的方法:

 [MethodImpl(MethodImplOptions.NoInlining)] public string GetCurrentMethod () { StackTrace st = new StackTrace (); StackFrame sf = st.GetFrame (1); return sf.GetMethod().Name; } 

更新信用到@stusmith。

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

反思有一个隐藏树木的诀窍。 准确,快速地获取当前方法名称,您永远不会有任何问题:

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

尽pipe重构工具可能不会自动修复它。

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

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

更新:C#版本5和.NET 4.5有这个共同需求的黄金解决scheme,您可以使用[CallerMemberName]属性让编译器自动生成一个string参数的调用方法的名称。 其他有用的属性是[CallerFilePath]让编译器生成源代码文件path,[CallerLineNumber]获取调用语句的源代码文件中的行号。


Update2:我现在可以在C#版本6中使用我在答案顶部提出的语法,而无需使用花哨的重构工具:

 string currentMethodName = nameof(MyMethod); 

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

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

或者试试这个

 string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, 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 

这不行吗?

 System.Reflection.MethodBase.GetCurrentMethod() 

返回表示当前正在执行的方法的MethodBase对象。

命名空间:System.Reflection

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

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

那么System.Reflection.MethodBase.GetCurrentMethod().Name不是一个很好的select,因为它只会显示方法名称,没有额外的信息。

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

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

看看这个: http : //www.codeproject.com/KB/dotnet/MethodName.aspx