Est-ce que quelqu'un a une bonne solution pour une version C# de la macro C++ __FUNCTION__? Le compilateur ne semble pas aimer ça.Version C# de la macro __FUNCTION__
Répondre
Essayez d'utiliser à la place.
System.Reflection.MethodBase.GetCurrentMethod().Name
C# ne pas __LINE__
ou __FUNCTION__
macros comme C++, mais il y a des équivalents
Ce qui suit devrait fonctionner, même si elle sera évaluée lors de l'exécution au lieu de la compilation.
System.Reflection.MethodBase.GetCurrentMethod().Name
Malheureusement, il n'y a pas de version équivalente de cette macro en C#. Je ne considère pas la solution GetCurrentMethodName() équivalente à la macro C++ __FUNCTION__. A savoir que la version C++ est un calcul de temps de compilation du nom. Pour C#, il s'agit d'un calcul d'exécution et un gain de performance.
Je ne fais aucun assumtions sur la gravité du coût, mais il y a un
Vrai, ce serait bien d'avoir une solution de compilation. Pour mon but la réflexion est tout à fait suffisante. –
Ce que j'utilise actuellement est une fonction comme ceci:
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
Quand j'ai besoin __FUNCTION__, je viens appeler le __Function() à la place. 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 (pas pour le traçage dans les versions de versions), la performance n'est pas importante.
je suppose que ce que je dois faire est de créer des fonctions de débogage et de les marquer avec
[ Conditional("Debug") ]
à la place
, mais je n'ai pas eu le temps de cela.
Merci à Jeff Mastry pour son solution à cela.
J'utilise ceci:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
Exemple d'utilisation:
s_log.DebugFormat("{0}", CallerName());
L'inconvénient de l'utiliser est que chaque fois que vous voulez imprimer le nom de l'appelant, vous devez passer à la fonction ==> prend du temps & performance hit! Donc, je l'utilise pour le débogage perpose et si j'ai besoin d'imprimer aussi dans le code de production, j'inline habituellement le nom de la fonction dans le log.Debug, par exemple. :
s_log.Debug("CallerName");
HTH ..
Ceci est ajouté à 4,5 .NET.
Voir la réponse de @ roken ici:
Comme celui-ci est haut et accepté, pouvez-vous/quelqu'un ajouter: System.Reflection.MethodBase.GetCurrentMethod().ToString() donnera aussi les params donc ce n'est pas ambigu face aux surcharges et que System.Reflection.MethodBase.GetCurrentMethod(). DeclaringType.ToString() pour donner le nom C (& namespace) –
il y a une métadonnée #line- macro, qui est utilisée pour donner des informations de débogage. Le compilateur va les injecter pour vous, alors faites attention en l'utilisant en code normal! –