2008-11-03 11 views

Respuesta

18

Intente usar esto en su lugar.

System.Reflection.MethodBase.GetCurrentMethod().Name 

C# no tiene __LINE__ o __FUNCTION__ macros como C++, pero no son equivalentes

+4

Como ésta es la parte superior y aceptado, puede usted/alguien añadir: System.Reflection.MethodBase.GetCurrentMethod().ToString() también producirá los parámetros, por lo que no es ambiguo frente a las sobrecargas y ese System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType.ToString() para dar el nombre C (y el espacio de nombres) –

+1

hay un metadatos #line macro, que se utiliza para proporcionar información de depuración. El compilador los inyectará por ti, ¡así que ten cuidado de usarlo en el código normal! –

4

El siguiente debe funcionar, a pesar de que será evaluado en tiempo de ejecución en lugar de durante la compilación.

System.Reflection.MethodBase.GetCurrentMethod().Name 
6

Desafortunadamente no hay una versión equivalente de esa macro en C#. No considero que la solución GetCurrentMethodName() sea equivalente a la macro C++ __FUNCTION__. A saber, porque la versión de C++ es un cálculo en tiempo de compilación del nombre. Para C#, este es un cálculo del tiempo de ejecución e incurre en un golpe de rendimiento.

No estoy haciendo ningún assumtions sobre la gravedad del costo, pero hay una

+0

Es cierto que sería bueno tener una solución en tiempo de compilación. Para mi propósito, la reflexión es suficiente. –

7

Lo que yo uso actualmente es una función como esta:

using System.Diagnostics; 

public string __Function() { 
    StackTrace stackTrace = new StackTrace(); 
    return stackTrace.GetFrame(1).GetMethod().Name; 
} 

Cuando necesito __FUNCTION__, acabo de llamar la función __Function() en su lugar. Por ejemplo:

Debug.Assert(false, __Function() + ": Unhandled option"); 

Por supuesto que esta solución también usa reflexión, pero es la mejor opción que puedo encontrar. Como solo lo uso para depurar (no para rastrear en compilaciones de versiones), el rendimiento no es importante.

Creo que lo que debería hacer es crear funciones de depuración y etiquetarlas con

[ Conditional("Debug") ] 

lugar, pero no he encontrado el momento de eso.

Gracias a Jeff Mastry por su solution a esto.

1

utilizo este:

public static string CallerName([CallerMemberName] string callerName = "") 
{ 
    return callerName; 
} 

Ejemplo de uso:

s_log.DebugFormat("{0}", CallerName()); 

El lado negativo de su uso es que cada vez que desea imprimir el nombre del remitente, tiene que saltar a la función ==> tiempo consumiendo & golpe de rendimiento! Por lo tanto, lo uso para la depuración y si necesito imprimir también en código de producción, normalmente inserto el nombre de la función en log.Debug, p. :

s_log.Debug("CallerName"); 

HTH ..