2008-11-03 10 views

Répondre

18

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

+4

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) –

+1

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! –

4

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 
6

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

+0

Vrai, ce serait bien d'avoir une solution de compilation. Pour mon but la réflexion est tout à fait suffisante. –

7

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.

1

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 ..

Questions connexes