Pregunta

¿Alguien tiene una buena solución para una versión C # de la macro C ++ __FUNCTION__? Al compilador no parece gustarle.

¿Fue útil?

Solución

Intenta usar esto en su lugar.

System.Reflection.MethodBase.GetCurrentMethod().Name

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

Otros consejos

Lo que 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__, solo llamo a __Function () en su lugar. Por ejemplo:

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

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

Creo que lo que debo hacer es crear funciones de depuración y etiquetarlas con

[ Conditional("Debug") ]

en cambio, pero no he llegado a eso.

Gracias a Jeff Mastry por su solución a esto.

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__. Es decir, porque la versión C ++ es un cálculo de tiempo de compilación del nombre. Para C #, este es un cálculo de tiempo de ejecución e incurre en un golpe de rendimiento.

No estoy haciendo ninguna suposición sobre la gravedad del costo, pero hay una

Lo siguiente debería funcionar, aunque se evaluará en tiempo de ejecución en lugar de durante la compilación.

System.Reflection.MethodBase.GetCurrentMethod().Name

Esto se agrega en .NET 4.5.

Vea la respuesta de @ roken aquí:

¿Existen equivalentes __LINE__ __FILE__ en C #?

Yo uso esto:

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

Ejemplo de uso:

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

La desventaja de usarlo es que cada vez que desea imprimir el nombre de la persona que llama, debe saltar a la función == > consume mucho tiempo & amp; golpe de rendimiento! Entonces, lo uso para depurar y, si necesito imprimir también en el código de producción, generalmente incluyo el nombre de la función en el registro. :

s_log.Debug("CallerName");

HTH ..

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top