2010-08-25 2 views
5

Il m'a été récemment demandé d'ajouter des instructions de journalisation à chaque appel de méthode dans une solution. Ces entrées de journal doivent contenir le nom de la classe et de la méthode. Je sais que je peux utiliser les méthodes MethodBase.GetCurrentMethod() et StackFrame.GetMethod(). Ce qui est mieux? Existe-t-il une meilleure façon (ou plus performante) d'obtenir le nom de la classe et de la méthode?Ouverture de session C#: obtention des performances de nom de classe/méthode

+5

* Toutes * méthode? Il existe des moyens plus simples de rendre votre application dix mille fois plus lente ou de générer un gigaoctet de texte par minute. –

+3

Mon lot dans la vie est seulement de faire ce que le client demande. –

+0

Il y a une place dans la relation de consultation pour une critique constructive et, en fait, c'est une partie importante du travail. J'ai travaillé sur des projets qui comportaient ce genre de consignation de traces omniprésente et il en résultait généralement que tout le monde ignorait les journaux à moins qu'ils n'aient absolument besoin de prendre les quelques heures nécessaires pour les explorer. –

Répondre

5

J'ai deux suggestions:

  1. Utiliser des cadres AOP ready-made (comme http://www.sharpcrafters.com/), ils peuvent gérer cela facilement
  2. Est-ce une action de pré-construits sur mesure où vous remplacez une sorte de talon au début de chaque méthode:

    vide PerformSomeAction() { // PUT_LOGGING_HERE }

puis dans un outil personnalisé, remplacez ces bouchons par des noms de méthode. C'est la méthode la plus rapide garantie, mais nécessite quelques investissements.

+0

+1, c'est ce type de scénario pour lequel AOP a été conçu. –

+0

Si je pouvais, j'ai déjà soulevé cette suggestion. Ce n'est pas que ce n'est pas un excellent point. –

1

this.getType().toString() vous devriez la classe

A propos de la méthode, il semble StackFrame et MethodBase sont les plus obvouis solutions, je ne peux pas commenter ce qui est plus efficace.

+1

sauf que c'est C#, pas Java, mais vous avez généralement raison – Andrey

+0

Devrait-il être this.GetType(). ToString()? ou est-ce que je manque quelque chose d'autre? – Raynos

+0

Object.ToString() retournera le nom de la classe sauf si ToString() a été remplacé. – Nate

2

Eh bien, le meilleur/le plus rapide est d'inclure une chaîne dans chaque fonction. Cela peut ne pas sembler la solution la plus pratique, mais MethodBase.GetCurrentMethod() exige le codage à l'intérieur de chaque méthode qui l'utilise de toute façon. dire que vous pouvez écrire

string funcName = "MyClass.MyFunction(int, int)"; 

ou vous pouvez écrire

string funcName = MethodBase.GetCurrentMethod().Name 

Maintenant, si vous voulez obtenir le nom de la fonction qui appelée la fonction en cours (c.-à-que vous voulez faire en un seul endroit dans votre fonction de journalisation), alors votre seule option est de lire le StackFrame.

+0

Si je me souviens bien, MethodBase.GetCurrentMethod() peut également renvoyer des résultats différents en fonction de l'inlining/optimisation effectuée par le compilateur, de sorte que les noms de fonctions hardcoding peuvent être plus fiables dans ce sens. –

+0

vous pouvez automatiser en incluant le nom de la fonction comme chaîne au processus de construction – Andrey