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
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);
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
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}()");
}
}
in der System.Reflection.MethodBase
Methode GetCurrentMethod
finden Sie alle Informationen zum Callstack mit Klassen etc
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);