Um den Status eines aktuellen Objekts zur Laufzeit anzuzeigen, gefällt mir sehr, was mir das Visual Studio-Sofortfenster bietet. Einfach ein einfaches machen
? objectname
Gibt mir einen schön formatierten 'Dump' des Objekts.
Gibt es eine einfache Möglichkeit, dies im Code zu tun, damit ich beim Protokollieren etwas Ähnliches tun kann?
Antworten:
Sie könnten etwas auf dem ObjectDumper-Code basieren, der mit den Linq-Beispielen geliefert wird .
Schauen Sie sich auch die Antwort auf diese verwandte Frage an, um ein Beispiel zu erhalten.
quelle
DumpToString
undDump
für dieObject
Klasse. Praktisch.w3wp.exe
stürzt ab, wenn ich versuche,ObjectDumper
like zu verwendenRequest.DumpToString("aaa");
Für ein größeres Objektdiagramm unterstütze ich die Verwendung von Json, jedoch mit einer etwas anderen Strategie. Zuerst habe ich eine statische Klasse, die einfach aufzurufen ist und eine statische Methode enthält, die die Json-Konvertierung umschließt (Hinweis: Dies könnte eine Erweiterungsmethode sein).
Dann in deinem
Immediate Window
,lookHere wird automatisch in dem
Locals
Fenster angezeigt, dem ein $ vorangestellt ist, oder Sie können eine Uhr hinzufügen. Auf der rechten Seite derValue
Säule im Inspektor befindet sich eine Lupe mit einem Dropdown-Caret daneben. Wählen Sie das Dropdown-Caret und dann Json Visualizer.Ich verwende Visual Studio 2013.
quelle
Newtonsoft.Json.JsonConvert.SerializeObject(sampleData, Formatting.Indented)
Ich bin mir sicher, dass es dafür bessere Möglichkeiten gibt, aber ich habe in der Vergangenheit eine Methode wie die folgende verwendet, um ein Objekt in eine Zeichenfolge zu serialisieren, die ich protokollieren kann:
Sie werden sehen, dass die Methode möglicherweise auch die Ausnahme anstelle des serialisierten Objekts zurückgibt. Sie sollten daher sicherstellen, dass die Objekte, die Sie protokollieren möchten, serialisierbar sind.
quelle
Failed to access type 'System.__ComObject' failed
. Noob zu c #, würde mich über Hilfe freuen.Sie können Visual Studio Immediate Window verwenden
Fügen Sie dies einfach ein (ändern
actual
Sie offensichtlich Ihren Objektnamen):Es sollte ein Objekt in JSON drucken
Sie sollten in der Lage sein, es über ein textmechanisches Textwerkzeug oder einen Editor ++ zu kopieren und maskierte Anführungszeichen (
\"
) durch"
und Zeilenumbrüche (\r\n
) durch Leerzeichen zu ersetzen. Entfernen Sie dann doppelte Anführungszeichen ("
) von Anfang und Ende und fügen Sie es in ein jsbeautifier ein , um es besser lesbar zu machen.UPDATE zum Kommentar von OP
Dies sollte es Ihnen ermöglichen, jedes Objekt zu sichern.
Hoffe das spart dir etwas Zeit.
quelle
Console.Log(Newtonsoft.Json.JsonConvert.SerializeObject(actual));
? :) und ja ich habe es wirklich verpasst. Diese Frage taucht auf, wenn Sie google.co.uk/…ServiceStack.Text verfügt über eine T.Dump () - Erweiterungsmethode , die genau dies tut und rekursiv alle Eigenschaften eines beliebigen Typs in einem gut lesbaren Format .
Anwendungsbeispiel:
und Ausgabe:
quelle
He didn't say fields
- sagte erentire objects
, die Felder enthält. Er erwähnte auch die Funktion "Sofortiges Fenster" von Visual Studio als Beispiel dafür, was er erreichen wollte ( "Wenn ich nur ein einfaches mache? objectname
, bekomme ich einen schön formatierten 'Dump' des Objekts" ).? objectname
druckt auch alle Felder aus.This has been immensely helpful - one of my most used extension methods to date
- Ich bezweifle nicht, dass es nützlich ist, sondern nur, dass ganze Objekte ausgegeben werden.Int32
Feld hat einMaxValue
Feld, das ein Selbst istInt32
...), das ist ein guter Punkt, aber es ändert nichts an der Tatsache, dass Objekte - und sicherlich ganze - bestehen auch aus Feldern, nicht nur aus Eigenschaften. Was mehr ist (du hast es nicht Adresse , dass man),? objectname
in demImmediate Window
tut Anzeigefeldern - ohne eine Endlosschleife auslösen. Wenn es um meine Ablehnung geht, kann ich sie zurückziehen (wenn Sie mich durch Entsperren lassen, das heißt). Ich bin sowieso grundsätzlich anderer Meinung.Hier ist eine dumm einfache Möglichkeit, ein flaches Objekt zu schreiben, das gut formatiert ist:
Was passiert ist, dass das Objekt zuerst von in eine interne JSON-Darstellung
JObject.FromObject
konvertiert und dann von in eine JSON-Zeichenfolge konvertiert wirdToString
. (Und natürlich ist eine JSON-Zeichenfolge eine sehr schöne Darstellung eines einfachen Objekts, zumalToString
sie Zeilenumbrüche und Einrückungen enthält.) Der "ToString" ist natürlich irrelevant (wie es impliziert wird+
, wenn eine Zeichenfolge und ein Objekt verwendet werden), aber Ich möchte es hier irgendwie spezifizieren.quelle
Sie können Reflection verwenden und alle Objekteigenschaften durchlaufen, dann ihre Werte abrufen und im Protokoll speichern. Die Formatierung ist wirklich trivial (Sie können \ t verwenden, um die Eigenschaften eines Objekts und seine Werte einzurücken):
quelle
Was ich gerne mache, ist das Überschreiben von ToString (), damit ich über den Typnamen hinaus eine nützlichere Ausgabe bekomme. Dies ist praktisch im Debugger. Sie können die gewünschten Informationen zu einem Objekt anzeigen, ohne es erweitern zu müssen.
quelle
Ich habe eine Bibliothek namens ObjectPrinter gefunden , mit der Objekte und Sammlungen einfach in Zeichenfolgen (und mehr) gespeichert werden können. Es macht genau das, was ich brauchte.
quelle
Das Folgende ist eine andere Version, die dasselbe tut (und verschachtelte Eigenschaften behandelt), was meiner Meinung nach einfacher ist (keine Abhängigkeiten von externen Bibliotheken und einfach zu ändern, um andere Dinge als die Protokollierung zu tun):
quelle
Date
Eigenschaft in Ihrem inneren Objekt haben ... nur sagen ...Sie können Ihre eigene WriteLine-Methode schreiben.
Verwenden Sie es wie-
Um eine Sammlung zu schreiben, können wir verwenden:
Die Methode kann wie folgt aussehen:
Wenn
if, else if
wir Schnittstellen, Attribute, Basistyp usw. und Rekursion (da dies eine rekursive Methode ist) verwenden und überprüfen, können wir auf diese Weise einen Objektdumper erzielen, der jedoch mit Sicherheit langwierig ist. Die Verwendung des Objektdummers aus dem LINQ-Beispiel von Microsoft würde Ihre Zeit sparen.quelle
Basierend auf der Antwort von @engineforce habe ich diese Klasse erstellt, die ich in einem PCL-Projekt einer Xamarin-Lösung verwende:
quelle
Bei allen oben genannten Pfaden wird davon ausgegangen, dass Ihre Objekte in XML oder JSON serialisierbar sind.
oder Sie müssen Ihre eigene Lösung implementieren.
Aber am Ende kommt man immer noch an den Punkt, an dem man Probleme wie lösen muss
Plus Protokoll Sie möchten weitere Informationen:
Es gibt die beste Lösung, die all dies und noch viel mehr löst.
Verwenden Sie dieses Nuget-Paket: Desharp .
Für alle Arten von Anwendungen - sowohl Web- als auch Desktop-Anwendungen .
Siehe Desharp Github-Dokumentation . Es gibt viele Konfigurationsoptionen .
Rufen Sie einfach irgendwo an:
Tat für alles , was Sie in einer .NET-Umgebung finden können .
Ich glaube es wird helfen.
quelle