代码之家  ›  专栏  ›  技术社区  ›  Nick Allen

如何从代码[重复]中获取当前方法的名称

  •  322
  • Nick Allen  · 技术社区  · 14 年前

    我知道你能做到

    this.GetType().FullName
    

    得到

    My.Current.Class
    

    但是我能打电话要什么

    My.Current.Class.CurrentMethod
    
    8 回复  |  直到 6 年前
        1
  •  313
  •   AustinWBryan ravenspoint    6 年前
    using System.Diagnostics;
    ...
    
    var st = new StackTrace();
    var sf = st.GetFrame(0);
    
    var currentMethodName = sf.GetMethod();
    

    或者,如果您想要一个助手方法:

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

    更新信用至@stusmith。

        2
  •  466
  •   Jamie Ide    14 年前

    呼叫 System.Reflection.MethodBase.GetCurrentMethod().Name 从方法内部。

        3
  •  87
  •   Hans Passant    7 年前

    倒影有一种为树木隐藏森林的诀窍。准确、快速地获取当前方法名是不会有问题的:

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

    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有这个共同需求的黄金解决方案,您可以使用 [CallerMemberName] attribute 让编译器在字符串参数中自动生成调用方法的名称。其他有用的属性是[CallerFieldPath]让编译器生成源代码文件路径,以及[CallerLineNumber]为发出调用的语句获取源代码文件中的行号。


    更新2:我在答案顶部提出的语法现在可以在C版本6中使用,而无需使用特殊的重构工具:

    string currentMethodName = nameof(MyMethod);
    
        4
  •  30
  •   Zakaria    11 年前

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

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

    或者试试这个

    string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name);   
    
        5
  •  10
  •   Orwellophile    12 年前

    这不管用吗?

    System.Reflection.MethodBase.GetCurrentMethod()
    

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

    命名空间:System.Reflection

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

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

        6
  •  9
  •   João Angelo    14 年前

    您也可以使用 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
    
        7
  •  5
  •   Arefin    11 年前

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

    喜欢 string MyMethod(string str) 上述财产将返还 MyMethod 这很难满足。

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

        8
  •  3
  •   Brian Mains    14 年前