Version C # de la macro __FUNCTION__
Question
Quelqu'un at-il une bonne solution pour une version C # de la macro C ++ __FUNCTION__? Le compilateur ne semble pas l’aimer.
La solution
Essayez d’utiliser ceci à la place.
System.Reflection.MethodBase.GetCurrentMethod().Name
C # n'a pas de macros __ LINE __
ou __ FUNCTION __
similaires à C ++, mais il existe des équivalents
Autres conseils
Ce que j'utilise actuellement est une fonction comme celle-ci:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
Lorsque j'ai besoin de __FUNCTION__, j'appelle simplement __Function (). Par exemple:
Debug.Assert(false, __Function() + ": Unhandled option");
Bien sûr, cette solution utilise également la réflexion, mais c’est la meilleure option que je puisse trouver. Comme je ne l’utilise que pour le débogage (et non pour le traçage dans les versions finales), l’atteinte à la performance n’est pas importante.
Je suppose que ce que je devrais faire, c'est créer des fonctions de débogage et les étiqueter avec
[ Conditional("Debug") ]
à la place, mais je n'ai pas eu le temps de le faire.
Merci à Jeff Mastry pour sa solution à ce problème.
Malheureusement, il n’existe pas de version équivalente de cette macro en C #. Je ne considère pas que la solution GetCurrentMethodName () soit équivalente à la macro C ++ __FUNCTION__. En effet, la version C ++ est un calcul du nom à la compilation. Pour C #, il s’agit d’un calcul d’exécution qui se traduit par une baisse des performances.
Je ne fais aucune hypothèse sur la gravité du coût, mais il y en a un
Ce qui suit devrait fonctionner, même s'il sera évalué à l'exécution plutôt qu'à la compilation.
System.Reflection.MethodBase.GetCurrentMethod().Name
Ceci est ajouté dans .NET 4.5.
Voir la réponse de @ roken ici:
J'utilise ceci:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
Exemple d'utilisation:
s_log.DebugFormat("{0}", CallerName());
L’inconvénient de son utilisation est que chaque fois que vous souhaitez imprimer le nom de l’appelant, vous devez accéder à la fonction == > fastidieux & amp; succès de la performance! Donc, je l’utilise pour le débogage et si j’ai besoin d’imprimer aussi dans le code de production, j’insère généralement le nom de la fonction dans le log.Debug, par exemple. :
s_log.Debug("CallerName");
HTH ..