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

Comment puis-je trouver le nom complet d'une méthode d'appel dans 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 de l'Appel nom de fonction Appelle la fonction

<!-Mais ils ne me donnent que le niveau supérieur. Prenons l'exemple:

namespace Sandbox
{
    class Program
    {
        static void Main(string[] args)
        {
            test();
        }

        static void test()
        {
            var stackTrace = new StackTrace();
            var methodBase = stackTrace.GetFrame(1).GetMethod();
            Console.WriteLine(methodBase.Name);
        }
    }
}

il s'agit simplement de sortir 'Main' Comment puis-je l'imprimer Bac à sable.Programme.Main'?

avant que quelqu'un commence à me demander pourquoi j'ai besoin d'utiliser ceci, c'est pour un cadre de journalisation simple sur lequel je travaille.

EDIT

ajouter à la réponse de Matzi:

Voici la solution:

namespace Sandbox
{
    class Program
    {
        static void Main(string[] 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 " Bac À Sable.Programme."Comme il se doit

18
demandé sur Community 2012-07-06 22:36:02

5 réponses

C'est quelque chose comme ici.

MethodBase method = stackTrace.GetFrame(1).GetMethod();
string methodName = method.Name;
string className = method.ReflectedType.Name;

Console.WriteLine(className + "." + methodName);
28
répondu Matzi 2017-05-23 11:54:19

je pense que le meilleur moyen d'obtenir le nom complet est:

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

ou bien

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

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

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

, mais si vous voulez afficher l'arbre des appels de fonctions, 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' info

4
répondu Zakaria 2018-05-04 16:36:50

System.Reflection.MethodBase méthode GetCurrentMethod Vous pouvez trouver toutes les informations sur callstack en utilisant les classes etc

0
répondu burning_LEGION 2012-07-06 18:40:26

Avec cette méthode vous pouvez obtenir de façon fiable le nom complet

    public void HandleException(Exception ex, [CallerMemberName] string 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}()");
        }
    }
0
répondu SubqueryCrunch 2016-11-08 14:02:24

namespace appelant courant qui n'est pas égal à namespace

    var mNamespace = new StackTrace().GetFrames()?.Select(x =>
                {
                    try
                    {
                        return x.GetMethod().ReflectedType?.Namespace;
                    }
                    catch (Exception)
                    {
                        return string.Empty;
                    }
                }).First(x => x != new StackTrace().GetFrame(0).GetMethod().ReflectedType?.Namespace);
0
répondu tom nobleman 2018-07-06 10:17:11