Frage

Ich möchte in der Lage sein, alle Parameterwerte aus dem Stapelrahmen in .NET zu erhalten. Ein bisschen wie, wie Sie in der Lage, die Werte in dem Call-Stack, wenn sie in dem Visual Studio-Debugger zu sehen. Mein Ansatz zur Verwendung der konzentriert StackFrame- Klasse und dann ein Parameterinfo Array. Ich habe Erfolg gehabt mit Reflexion und Eigenschaften, aber ein bisschen schwieriger erweist.

Gibt es einen Ansatz, um dies zu erreichen?

Der Code so weit sieht wie folgen aus:

class Program
{
    static void Main(string[] args)
    {
        A a = new A();
        a.Go(1);
    }
}

public class A
{
    internal void Go(int x)
    {
        B b = new B();
        b.Go(4);
    }
}

public class B
{
    internal void Go(int y)
    {
        Console.WriteLine(GetStackTrace());

    }
    public static string GetStackTrace()
    {
        StringBuilder sb = new StringBuilder();
        StackTrace st = new StackTrace(true);
        StackFrame[] frames = st.GetFrames();

        foreach (StackFrame frame in frames)
        {
            MethodBase method = frame.GetMethod();

            sb.AppendFormat("{0} - {1}",method.DeclaringType, method.Name);
            ParameterInfo[] paramaters = method.GetParameters();
            foreach (ParameterInfo paramater in paramaters)
            {
                sb.AppendFormat("{0}: {1}", paramater.Name, paramater.ToString());
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }
}

Die Ausgabe sieht wie folgt aus:

SfApp.B - GetStackTrace
SfApp.B - Go
y: Int32 y
SfApp.A - Go
x: Int32 x
SfApp.Program - Main
args: System.String[] args

Ich möchte es eher wie folgt aussehen:

SfApp.B - GetStackTrace
SfApp.B - Go
y: 4
SfApp.A - Go
x: 1
SfApp.Program - Main

Gerade für ein wenig Kontext, war mein Plan zu versuchen und dieses zu verwenden, wenn ich meine eigenen Ausnahmen werfen. Ich werde noch näher an Ihre Vorschläge und sehen, ob ich es passend, sehen kann.

War es hilfreich?

Lösung

Es scheint, es kann nicht auf diese Weise durchgeführt werden. Es wird nur Metainformationen über das Verfahren zur Verfügung stellen und deren Parameter. Nicht der tatsächliche Wert zum Zeitpunkt der Aufrufliste.

Einige schlagen vor, Ihre Klassen abgeleitet von Context und Verwendung IMessageSink werden alle angemeldeten off Methodenaufrufe und die Werte des Parameters. Dies wird normalerweise verwendet für .NET Remoting .

Ein weiterer Vorschlag könnte sein, einen Debugger zu schreiben. Dies ist, wie die IDE seine Informationen bekommen. Microsoft hat MDBG von dem Sie die Quelle bekommen Code. Oder schreiben Sie eine CLR Profiler .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top