web-dev-qa-db-fra.com

Comment déterminer la méthode d'appel et le nom de classe?

Je suis en train de développer une bibliothèque de journalisation des applications en utilisant le TraceListener intégré. Cette bibliothèque sera utilisée dans de nombreux projets et devrait offrir une interface simple où je n'ai qu'à me soucier de CE QUI va être écrit dans le fichier journal, mais pas COMMENT.

En utilisant l'espace de noms de réflexion, je peux déterminer quelle application appelle actuellement une fonction de journal (récupération du nom de l'assembly d'exécution), mais je veux également le nom de la fonction et de la classe qui a appelé la fonction de journalisation.

Disons que j'ai:

public static void LogInfo(string vLogText) {
   Trace.WriteLine(
        MethodInfo.GetCurrentMethod().Name
        + this.GetType().ToString() + vLogText);
   }

Lorsque j'appelle depuis un autre projet (classe: TestClass, méthode: TestMethod)

Tracer.LogInfo("log this!")

Je m'attends à voir dans le journal:

TestClass, TestMethod, log this!

Mais à la place, j'ai

TracerClass, LogInfo, log this!

Comment obtenir la méthode parent et le nom de classe?

37
Neurodefekt

Essayez de faire quelque chose comme ça:

var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name;
// where 1 illustrates how deep into the stack to reflect.

Il existe des solutions plus élégantes dans C # 5.0>, mais si vous utilisez des frameworks plus anciens, ce qui précède vous aidera.

25
Jens Kloster

Vous pouvez simplement enregistrer la trace de pile complète au lieu de simplement la méthode d'appel en utilisant Environment.StackTrace. Cela peut vous aider si vous souhaitez utiliser la même structure de journalisation pour consigner les exceptions.

Reportez-vous à cette page msdn pour plus d'informations.

2
daryal