Cómo obtener el nombre del método actual del código

Sé que puedes hacer

this.GetType().FullName 

Llegar

 My.Current.Class 

Pero, ¿a qué puedo llamar para obtener

 My.Current.Class.CurrentMethod 

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

O bien, si desea tener un método de ayuda:

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

Actualizado con créditos a @stusmith.

Llame a System.Reflection.MethodBase.GetCurrentMethod().Name dentro del método.

La reflexión tiene una habilidad especial para ocultar el bosque de los árboles. Nunca tiene problemas para obtener el nombre del método actual con precisión y rapidez:

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

Aunque es probable que una herramienta de refactorización no lo arregle automáticamente.

Si no te importa el costo (considerable) de usar Reflection, entonces este método de ayuda debería 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; } 

Actualización: C # versión 5 y .NET 4.5 tienen la solución dorada para esta necesidad común, puede usar el atributo [CallerMemberName] para que el comstackdor genere automáticamente el nombre del método de llamada en un argumento de cadena. Otros atributos útiles son [CallerFilePath] para que el comstackdor genere la ruta del archivo de código fuente y [CallerLineNumber] para obtener el número de línea en el archivo de código fuente para la statement que realizó la llamada.


Actualización2: la syntax que propuse en la parte superior de la respuesta ahora se puede hacer funcionar en la versión 6 de C # sin una herramienta de refactorización sofisticada:

 string currentMethodName = nameof(MyMethod); 

Creo que la mejor manera de obtener el nombre completo es:

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

o prueba esto

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

¿Esto no funciona?

 System.Reflection.MethodBase.GetCurrentMethod() 

Devuelve un objeto MethodBase que representa el método actualmente en ejecución.

Espacio de nombres: System.Reflection

Asamblea: mscorlib (en mscorlib.dll)

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

También puede usar MethodBase.GetCurrentMethod() que impedirá que el comstackdor JIT incluya el método donde se usa.


Actualizar:

Este método contiene una enumeración especial StackCrawlMark que, según entiendo, especificará al comstackdor JIT que el método actual no debe estar en línea.

Esta es mi interpretación del comentario asociado a esa enumeración presente en SSCLI. El comentario sigue:

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

Bien System.Reflection.MethodBase.GetCurrentMethod().Name no es una muy buena opción porque solo mostrará el nombre del método sin información adicional.

Al igual que para la string MyMethod(string str) la propiedad anterior devolverá simplemente MyMethod que es apenas adecuada.

Es mejor usar System.Reflection.MethodBase.GetCurrentMethod().ToString() que devolverá la firma completa del método …