Donc, pour afficher l'état d'un objet actuel au moment de l'exécution, j'aime vraiment ce que la fenêtre Visual Studio Immediate me donne. Faire juste un simple
? objectname
Me donnera un «vidage» bien formaté de l'objet.
Existe-t-il un moyen simple de le faire dans le code, afin que je puisse faire quelque chose de similaire lors de la journalisation?
Réponses:
Vous pouvez baser quelque chose sur le code ObjectDumper fourni avec les exemples Linq .
Jetez également un œil à la réponse à cette question connexe pour obtenir un échantillon.
la source
DumpToString
etDump
uneObject
classe. Pratique.w3wp.exe
plante quand j'essaye d'utiliserObjectDumper
commeRequest.DumpToString("aaa");
Pour un graphe d'objets plus grand, je seconde l'utilisation de Json mais avec une stratégie légèrement différente. J'ai d'abord une classe statique qui est facile à appeler et avec une méthode statique qui encapsule la conversion Json (note: pourrait en faire une méthode d'extension).
Puis dans votre
Immediate Window
,lookHere s'affichera automatiquement dans la
Locals
fenêtre précédée d'un $ ou vous pouvez y ajouter une montre. Sur le côté droit de laValue
colonne dans l'inspecteur, il y a une loupe avec un curseur déroulant à côté. Choisissez le curseur de la liste déroulante et choisissez le visualiseur Json.J'utilise Visual Studio 2013.
la source
Newtonsoft.Json.JsonConvert.SerializeObject(sampleData, Formatting.Indented)
Je suis certain qu'il existe de meilleures façons de faire cela, mais j'ai dans le passé utilisé une méthode semblable à la suivante pour sérialiser un objet dans une chaîne que je peux enregistrer:
Vous verrez que la méthode peut également renvoyer l'exception plutôt que l'objet sérialisé, vous voudrez donc vous assurer que les objets que vous souhaitez consigner sont sérialisables.
la source
Failed to access type 'System.__ComObject' failed
. Noob to c #, apprécierait de l'aide.Vous pouvez utiliser la fenêtre immédiate de Visual Studio
Collez simplement ceci (changez
actual
évidemment le nom de votre objet):Il devrait imprimer l'objet en JSON
Vous devriez pouvoir le copier sur l'outil de texte textmechanic ou notepad ++ et remplacer les guillemets échappés (
\"
) par"
et newlines (\r\n
) par un espace vide, puis supprimer les guillemets doubles ("
) du début et de la fin et le coller dans jsbeautifier pour le rendre plus lisible.MISE À JOUR du commentaire d'OP
cela devrait vous permettre de vider n'importe quel objet.
J'espère que cela vous fera gagner du temps.
la source
Console.Log(Newtonsoft.Json.JsonConvert.SerializeObject(actual));
? :) et oui je l'ai manqué. Cette question se pose lorsque vous recherchez google.co.uk/...ServiceStack.Text a une méthode d'extension T.Dump () qui fait exactement cela, vide récursivement toutes les propriétés de n'importe quel type dans un bon format lisible.
Exemple d'utilisation:
et sortie:
la source
He didn't say fields
- dit-ilentire objects
, qui comprend les champs. Il a également mentionné la fonctionnalité Fenêtre immédiate de Visual Studio comme exemple de ce qu'il voulait réaliser ( «Faire un simple? objectname
me donnera un 'vidage' bien formaté de l'objet» ).? objectname
imprime également tous les champs.This has been immensely helpful - one of my most used extension methods to date
- Je ne mets pas en doute que c'est utile, mais seulement qu'il vide des objets entiers.Int32
champ a unMaxValue
champ, qui est unInt32
lui-même ...), c'est un bon point, mais cela ne change pas le fait que les objets - et certainement ceux entiers - se composent également de champs, pas seulement de propriétés. De plus (vous ne l' avez pas l' adresse que l' on),? objectname
dans lesImmediate Window
ne champs d'affichage - sans déclencher une boucle infinie. S'il s'agit de mon vote défavorable, je peux le retirer (si vous me le permettez en le déverrouillant, c'est-à-dire). Je ne suis pas d’accord en principe de toute façon.Voici une façon stupidement simple d'écrire un objet plat, joliment formaté:
Ce qui se passe, c'est que l'objet est d'abord converti en une représentation interne JSON par
JObject.FromObject
, puis converti en chaîne JSON parToString
. (Et bien sûr, une chaîne JSON est une très belle représentation d'un objet simple, d'autant plusToString
qu'elle inclura des retours à la ligne et des retraits.) Le "ToString" est bien sûr étranger (comme il est impliqué en utilisant+
pour concaténer une chaîne et un objet), mais J'aime un peu le spécifier ici.la source
Vous pouvez utiliser la réflexion et parcourir toutes les propriétés de l'objet, puis obtenir leurs valeurs et les enregistrer dans le journal. Le formatage est vraiment trivial (vous pouvez utiliser \ t pour indenter les propriétés d'un objet et ses valeurs):
la source
Ce que j'aime faire, c'est remplacer ToString () afin d'obtenir une sortie plus utile au-delà du nom du type. Ceci est pratique dans le débogueur, vous pouvez voir les informations souhaitées sur un objet sans avoir besoin de le développer.
la source
J'ai trouvé une bibliothèque appelée ObjectPrinter qui permet de vider facilement des objets et des collections dans des chaînes (et plus). Il fait exactement ce dont j'avais besoin.
la source
Voici une autre version qui fait la même chose (et gère les propriétés imbriquées), ce que je pense est plus simple (pas de dépendances sur les bibliothèques externes et peut être modifiée facilement pour faire des choses autres que la journalisation):
la source
Date
propriété dans votre objet intérieur ... il suffit de dire ...Vous pouvez écrire votre propre méthode WriteLine-
Utilisez-le comme-
Pour écrire une collection, nous pouvons utiliser-
La méthode peut ressembler à -
En utilisant
if, else if
et en vérifiant les interfaces, les attributs, le type de base, etc. et la récursivité (car c'est une méthode récursive) de cette façon, nous pouvons réaliser un vidage d'objets, mais c'est certainement fastidieux. L'utilisation du videur d'objets de l'exemple LINQ de Microsoft vous fera gagner du temps.la source
Sur la base de la réponse @engineforce, j'ai créé cette classe que j'utilise dans un projet PCL d'une solution Xamarin:
la source
Tous les chemins ci-dessus supposent que vos objets sont sérialisables en XML ou JSON,
ou vous devez implémenter votre propre solution.
Mais à la fin, vous arrivez toujours au point où vous devez résoudre des problèmes tels que
Plus journal que vous voulez plus d'informations:
Il existe la meilleure solution qui résout tout cela et bien plus encore.
Utilisez ce package Nuget : Desharp .
Pour tous les types d'applications - applications Web et de bureau .
Voir sa documentation Desharp Github . Il a de nombreuses options de configuration .
Appelez n'importe où:
fait pour tout ce que vous pouvez trouver dans l'environnement .NET .
Je crois que cela aidera.
la source