如何从代码中获取当前方法的名称
我知道你可以做
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