¿Alguien tiene una buena solución para una versión C# de la macro C++ __FUNCTION__? Al compilador no parece gustarle.Versión C# de __FUNCTION__ macro
Respuesta
Intente usar esto en su lugar.
System.Reflection.MethodBase.GetCurrentMethod().Name
C# no tiene __LINE__
o __FUNCTION__
macros como C++, pero no son equivalentes
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
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
Es cierto que sería bueno tener una solución en tiempo de compilación. Para mi propósito, la reflexión es suficiente. –
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.
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 ..
Esto se añade en .NET 4.5. respuesta
Ver @ de roken aquí:
- 1. ¿Cómo imito la versión de Microsoft de __FUNCTION__ usando gcc?
- 2. GCC, Unicode y __FUNCTION__
- 3. ¿Hay una macro __CLASS__ en C++?
- 4. multiplataforma definir #define para macros __FUNCTION__ y __func__
- 5. Personalizar C++ afirmar macro
- 6. __FILE__, __LINE__, y el uso __FUNCTION__ en C++
- 7. Preprocesador C Macro que define Macro
- 8. C macro/# define indentación?
- 9. C++ macro - capitalizar cadena
- 10. C++ 11 macro predefinida
- 11. C macro argumento de 'almacenamiento'
- 12. Preprocesador C: macro macro e identidad de stringize
- 13. C/C++ geniales definiciones de macro?
- 14. C macro para la detección de la versión OS X (León o no)?
- 15. Embedded función C macro problema
- 16. C++ formato macro/inline ostringstream
- 17. Objetivo C MAX insecto macro
- 18. C++ plantilla de macro de acceso directo
- 19. C: Macro de expansión Con simbólico pegar
- 20. C# versión de optparse?
- 21. macro macro dependiente
- 22. C/C++ Expansión de macro vs. Generación de código
- 23. Sobrecarga C macros
- 24. Ver la versión ampliada de macro de la fuente durante la depuración
- 25. Las expresiones regulares en C preprocesador macro
- 26. Gnu C++ macro __cplusplus estándar conformes?
- 27. C macro: # si se comprueba la igualdad
- 28. ¿Cómo implementar una macro genérica en C?
- 29. C++ # ¿define una macro con corchetes?
- 30. Reutilizando una macro C en varios archivos
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) –
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! –