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:
- 1. __FILE__, __LINE__, et l'utilisation de __FUNCTION__ en C++
- 2. Extension de macro en C++
- 3. modèle de C raccourci macro
- 4. étrange macro syntaxe C (#var)
- 5. que fait cette macro C++?
- 6. Identification de la version de Windows [C/C++]
- 7. Que signifie la macro?
- 8. Comment faire une chaîne de caractère à partir de la valeur d'une macro C?
- 9. Quelle version de C# j'utilise?
- 10. Version C# et .NET Framework Version?
- 11. Version C de C++ std :: map
- 12. Obtention du nom de la méthode actuelle en C++
- 13. Obtention de la version
- 14. Saut DataContractSerializer OpenAccess Version de la version
- 15. Quelle est la version C# de InputDialog de VB.net?
- 16. La macro SAS inclut des protections
- 17. Macro remplacement pendant la génération de code
- 18. Confus au sujet de l'arithmétique C Dilatation macro et entier
- 19. Empêcher le préprocesseur C d'effectuer une macro de substitution spécifique
- 20. Génération et enregistrement de code à partir de la macro
- 21. La version de la version iPhone ne fonctionne pas de la même manière que la version de débogage
- 22. macro Inline ostringstream rechargées
- 23. C# + COM Interop, version déterministe
- 24. Options de scrappage Web - Version C++ uniquement
- 25. Comment désactiver la bulle "tip" de la macro Visual Studio?
- 26. Comment sélectionner la cellule à partir de la macro
- 27. CONFUSED - C++ Bibliothèque tierce partie, nouvelle version de C++
- 28. macro problème
- 29. Obtenir la version d'Appengine version publiée
- 30. Format infixe pour la macro Nemerle
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! –