webentwicklung-frage-antwort-db.com.de

So finden Sie den vollständigen Namen der aufrufenden Methode C #

Wie finde ich den vollständigen Namen einer aufrufenden Methode in C #. Ich habe Lösungen gesehen:

Wie kann ich die aufrufenden Methoden in C # bekommen

Wie kann ich die Methode finden, die die aktuelle Methode aufgerufen hat?

Get Calling Funktionsname von aufgerufenen Funktion

Aber sie geben mir nur die oberste Ebene. Betrachten Sie das Beispiel:

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

Dies gibt einfach 'Main' aus. Wie kann ich dafür sorgen, dass 'Sandbox.Program.Main' gedruckt wird?

Bevor jemand fragt, warum ich das verwenden muss, ist es ein einfaches Protokollierungsframework, an dem ich arbeite.

EDIT

Hinzufügen zu Matzis Antwort:

Hier ist die Lösung:

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

Erzeugt 'Sandbox.Program.Main' wie es sollte

18
Adam Schiavone

Das ist so etwas wie hier .

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

Console.WriteLine(className + "." + methodName);
29
Matzi

Ich denke, der beste Weg, um den vollständigen Namen zu erhalten, ist:

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

oder versuchen Sie es

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

und wenn Sie den letzten Funktionsaufruf anzeigen möchten, können Sie Folgendes verwenden:

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

Wenn Sie jedoch den Baum der aufrufenden Funktionen anzeigen möchten, können Sie dies folgendermaßen tun:

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

für mehr info

4
Zakaria

Mit dieser Methode erhalten Sie zuverlässig den vollständigen Namen

    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
SubqueryCrunch

in der System.Reflection.MethodBase Methode GetCurrentMethod finden Sie alle Informationen zum Callstack mit Klassen etc

0
burning_LEGION

aktueller aufrufender Namespace, der nicht dem aktuellen Namespace entspricht

    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
tom nobleman