net name documentacion comentarios code c# introspection

name - comments code c#



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

¿Esto no funciona?

System.Reflection.MethodBase.GetCurrentMethod()

Devuelve un objeto MethodBase que representa el método que se está ejecutando actualmente.

Espacio de nombres: System.Reflection

Ensamblaje: mscorlib (en mscorlib.dll)

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

Se que puedes hacer

this.GetType().FullName

Llegar

My.Current.Class

¿Pero a qué puedo llamar para que me den

My.Current.Class.CurrentMethod


Bueno, 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á solo MyMethod cual no es adecuado.

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



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


La reflexión tiene una habilidad especial para esconder el bosque para los árboles. Nunca tiene problemas para obtener el nombre del método actual de forma precisa y rápida:

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

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

Si no te importa por completo el costo (considerable) de usar Reflection, 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 de oro para esta necesidad común, puede usar el atributo [CallerMemberName] para que el compilador genere automáticamente el nombre del método de llamada en un argumento de cadena. Otros atributos útiles son [CallerFilePath] para que el compilador 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 declaración que realizó la llamada.

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

string currentMethodName = nameof(MyMethod);


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


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

Actualizar:

Este método contiene una enumeración especial StackCrawlMark que, según mi entender, especificará al compilador 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


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

O, 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.