Comment trouver le nom complet de la méthode d’appel C #

Comment trouver le nom complet d’une méthode d’appel en c #. J’ai vu des solutions:

Comment obtenir les méthodes d’appel en C #

Comment puis-je trouver la méthode qui a appelé la méthode actuelle?

Obtenir le nom de la fonction appelante à partir de la fonction appelée

Mais ils ne me donnent que le plus haut niveau. Considérons l’exemple:

namespace Sandbox { class Program { static void Main(ssortingng[] args) { test(); } static void test() { var stackTrace = new StackTrace(); var methodBase = stackTrace.GetFrame(1).GetMethod(); Console.WriteLine(methodBase.Name); } } } 

Ceci affiche simplement ‘Principal’. Comment puis-je le faire imprimer ‘Sandbox.Program.Main’?

Avant que quiconque ne commence à demander pourquoi je dois utiliser ceci, c’est pour un cadre de journalisation simple sur lequel je travaille.

MODIFIER

Ajout sur la réponse de Matzi:

Voici la solution:

 namespace Sandbox { class Program { static void Main(ssortingng[] args) { test(); } static void test() { var stackTrace = new StackTrace(); var methodBase = stackTrace.GetFrame(1).GetMethod(); var Class = methodBase.ReflectedType; var Namespace = Class.Namespace; //Added finding the namespace Console.WriteLine(Namespace + "." + Class.Name + "." + methodBase.Name); } } } 

Produit ‘Sandbox.Program.Main’ comme il se doit

C’est quelque chose comme ici .

 MethodBase method = stackTrace.GetFrame(1).GetMethod(); ssortingng methodName = method.Name; ssortingng className = method.ReflectedType.Name; Console.WriteLine(className + "." + methodName); 

Je pense que le meilleur moyen d’obtenir le nom complet est:

  this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name; 

ou essayez ceci

 ssortingng method = ssortingng.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name); 

et si vous souhaitez afficher l’appel de fonction le plus récent, vous pouvez utiliser:

 StackTrace st = new StackTrace(); StackFrame sf = st.GetFrame(0); var methodName = sf.GetMethod(); 

, mais si vous voulez afficher l’arbre des fonctions d’appel, vous pouvez le faire comme ceci:

 if (st.FrameCount >1) { // Display the highest-level function call // in the trace. StackFrame sf = st.GetFrame(st.FrameCount-1); Console.WriteLine(" Original function call at top of call stack):"); Console.WriteLine(" {0}", sf.GetMethod()); } 

pour plus d’ infos

Dans la méthode System.Reflection.MethodBase , GetCurrentMethod vous pouvez trouver des informations complètes sur la stack d’appels à l’aide de classes, etc.

Avec cette méthode, vous pouvez obtenir le nom complet de manière fiable.

  public void HandleException(Exception ex, [CallerMemberName] ssortingng caller = "") { if (ex != null) { while (ex.InnerException != null) ex = ex.InnerException; foreach (var method in new StackTrace().GetFrames()) { if (method.GetMethod().Name == caller) { caller = $"{method.GetMethod().ReflectedType.Name}.{caller}"; break; } } Console.WriteLine($"Exception: {ex.Message} Caller: {caller}()"); } } 

espace de noms d’appel actuel qui n’est pas égal à l’espace de noms actuel

  var mNamespace = new StackTrace().GetFrames()?.Select(x => { try { return x.GetMethod().ReflectedType?.Namespace; } catch (Exception) { return ssortingng.Empty; } }).First(x => x != new StackTrace().GetFrame(0).GetMethod().ReflectedType?.Namespace);