2010-08-25 10 views
5

Recientemente me han encomendado la tarea de agregar sentencias de registro a cada llamada de método en una solución. Estas entradas de registro deben contener la clase y el nombre del método.Iniciando sesión C#: Obteniendo el rendimiento del nombre de clase/método

Sé que puedo usar MethodBase.GetCurrentMethod() y los métodos StackFrame.GetMethod(). ¿Cual es mejor? ¿Hay una forma mejor (o más eficiente) de obtener la clase y el nombre del método?

+5

* ¿Cada * método? Hay formas más fáciles de hacer que tu aplicación sea diez mil veces más lenta o de generar un gigabyte de texto por minuto. –

+3

Mi suerte en la vida es solo hacer lo que el cliente pide. –

+0

hay un lugar en la relación de consultoría para la crítica constructiva y, de hecho, es una parte importante del trabajo. Trabajé en proyectos que tenían este tipo de registro de rastreo generalizado y, por lo general, todos ignoraban los registros a menos que tuvieran que tomar las horas necesarias para explorarlos. –

Respuesta

5

Tengo dos sugerencias:

  1. Use marcos AOP ya hecho (como http://www.sharpcrafters.com/) que pueden manejar esto fácilmente
  2. Haz una acción prebuild personalizada, en la que sustituya algún tipo de talón en el principio de todos los métodos:

    vacío PerformSomeAction() { // PUT_LOGGING_HERE }

luego en la herramienta personalizada reemplazar los talones con los nombres de los métodos. Este es el método más rápido garantizado, pero requiere algunas inversiones.

+0

+1, este es el tipo de escenario para el que se creó AOP. –

+0

Si pudiera, ya he mencionado esa sugerencia. No es que no sea un excelente punto. –

1

this.getType().toString() debe conseguir que la clase

Sobre el método parece StackFrame y MethodBase son los más obvouis soluciones, que no puedo comentar sobre el que es más eficiente.

+1

excepto que este es C#, no Java, pero en general es correcto – Andrey

+0

¿Debería ser esto? GetType(). ToString()? o me falta algo más – Raynos

+0

Object.ToString() devolverá el nombre de la clase a menos que se sobreescriba ToString(). – Nate

2

Bueno, la mejor/más rápida forma es incluir una cadena en cada función. Puede que no parezca la solución más práctica, pero MethodBase.GetCurrentMethod() requiere la codificación dentro de cada método para usarlo de todos modos. es decir, puede escribir

string funcName = "MyClass.MyFunction(int, int)"; 

o puede escribir

string funcName = MethodBase.GetCurrentMethod().Name 

Ahora, si desea obtener el nombre de la función que llamados la función actual (es decir, que quiere hacer esto en un punto en su función de registro), entonces su única opción es leer a través del StackFrame.

+0

Si recuerdo bien, MethodBase.GetCurrentMethod() también puede devolver resultados diferentes en función de cualquier alineación/optimización realizada por el compilador, por lo que los nombres de las funciones de codificación pueden ser más confiables en ese sentido. –

+0

puede automatizar incluyendo el nombre de la función como cadena en el proceso de compilación – Andrey

Cuestiones relacionadas