Como obter o nome do método atual do código

Eu sei que você pode fazer

this.GetType().FullName 

Para obter

 My.Current.Class 

Mas o que posso chamar para obter

 My.Current.Class.CurrentMethod 

     using System.Diagnostics; ... var st = new StackTrace(); var sf = st.GetFrame(0); var currentMethodName = sf.GetMethod(); 

    Ou, se você quiser ter um método auxiliar:

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

    Atualizado com créditos para @stusmith.

    Chame System.Reflection.MethodBase.GetCurrentMethod().Name de dentro do método.

    Reflexão tem um jeito para esconder a floresta para as trees. Você nunca teve problemas para obter o nome do método atual com precisão e rapidez:

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

    Embora uma ferramenta de refatoração provavelmente não conserte automaticamente.

    Se você não se importa com o custo (considerável) do uso do Reflection, então este método auxiliar deve ser útil:

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

    Atualização: C # versão 5 e .NET 4.5 tem a solução dourada para essa necessidade comum, você pode usar o atributo [CallerMemberName] para que o compilador gerar automaticamente o nome do método de chamada em um argumento de seqüência de caracteres. Outros atributos úteis são [CallerFilePath] para que o compilador gere o caminho do arquivo de código-fonte e [CallerLineNumber] para obter o número da linha no arquivo de código-fonte da instrução que fez a chamada.


    Update2: a syntax que eu propus no topo da resposta agora pode ser feita para trabalhar no C # versão 6 sem uma ferramenta sofisticada de refatoração:

     string currentMethodName = nameof(MyMethod); 

    Acho que a melhor maneira de obter o nome completo é:

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

    ou tente isso

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

    Isso não funciona?

     System.Reflection.MethodBase.GetCurrentMethod() 

    Retorna um object MethodBase representando o método atualmente em execução.

    Namespace: System.Reflection

    Assembly: mscorlib (em mscorlib.dll)

    http://msdn.microsoft.com/pt-br/library/system.reflection.methodbase.getcurrentmethod.aspx

    Você também pode usar MethodBase.GetCurrentMethod() que inibirá o compilador JIT de inlining o método onde é usado.


    Atualizar:

    Este método contém uma enumeração especial StackCrawlMark que, do meu entendimento, especificará ao compilador JIT que o método atual não deve ser embutido.

    Esta é a minha interpretação do comentário associado à enumeração presente na SSCLI. O comentário segue:

     // 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 

    Bem, System.Reflection.MethodBase.GetCurrentMethod().Name não é uma boa escolha, pois apenas exibirá o nome do método sem informações adicionais.

    Como para a string MyMethod(string str) a propriedade acima retornará apenas MyMethod que dificilmente é adequado.

    É melhor usar System.Reflection.MethodBase.GetCurrentMethod().ToString() que retornará toda a assinatura do método …