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