189 votes

Quelle est la meilleure méthode pour exporter des objets entiers dans un journal en C#?

Donc pour la visualisation d'un objet courant de l'état au moment de l'exécution, j'aime vraiment ce que Visual Studio Immédiate fenêtre me donne. Juste faire une simple

? objectname

Va me donner un bien formaté "décharger" de l'objet.

Est-il un moyen facile de le faire dans le code, afin que je puisse faire quelque chose de similaire lors de l'enregistrement?

63voto

Mike Scott Points 6062

Vous pourriez de la base de quelque chose sur le ObjectDumper code fourni avec le Linq échantillons.
Ont également un oeil à la réponse à cette question connexe pour obtenir un échantillon.

29voto

Bernhard Hofmann Points 4741

Je suis certain qu'il existe de meilleures façons de le faire, mais dans le passé j'ai utilisé une méthode similaire à l'exemple suivant pour sérialiser un objet en chaîne de caractères que je peux me connecter:

  private string ObjectToXml(object output)
  {
     string objectAsXmlString;

     System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(output.GetType());
     using (System.IO.StringWriter sw = new System.IO.StringWriter())
     {
        try
        {
           xs.Serialize(sw, output);
           objectAsXmlString = sw.ToString();
        }
        catch (Exception ex)
        {
           objectAsXmlString = ex.ToString();
        }
     }

     return objectAsXmlString;
  }

Vous verrez que la méthode pourrait également renvoyer à l'exception plutôt que l'objet sérialisé, de sorte que vous aurez envie de vous assurer que les objets que vous voulez vous connecter sont sérialisables.

22voto

mythz Points 54874

J'ai un T. Dump() la méthode d'extension qui fait exactement cela, de manière récursive les vidages de toutes les propriétés de n'importe quel type, dans un beau format lisible.

Exemple d'utilisation:

var model = new TestModel();
Console.WriteLine(model.Dump());

et sortie:

{
    Int: 1,
    String: One,
    DateTime: 2010-04-11,
    Guid: c050437f6fcd46be9b2d0806a0860b3e,
    EmptyIntList: [],
    IntList:
    [
        1,
        2,
        3
    ],
    StringList:
    [
        one,
        two,
        three
    ],
    StringIntMap:
    {
        a: 1,
        b: 2,
        c: 3
    }
}

20voto

Hot Licks Points 25075

Voici une stupidement simple façon d'écrire un objet plat, bien mis en forme:

using Newtonsoft.Json.Linq;

Debug.WriteLine("The object is " + JObject.FromObject(theObjectToDump).ToString());

Ce qui se passe est que l'objet est d'abord converti en JSON représentation interne en JObject.FromObject, et ensuite convertis en chaîne JSON en ToString. (Et bien sûr une chaîne JSON est une très belle représentation d'un objet simple, surtout depuis ToString comprendra des sauts de ligne et des tirets.) Le "ToString" est superflu (comme il est implicite en utilisant + de la concaténation d'une chaîne et d'un objet), mais j'aime un peu le spécifier ici.

5voto

Ricardo Villamil Points 3080

Vous pouvez utiliser la réflexion et la boucle à travers toutes les propriétés de l'objet, puis obtenir leurs valeurs et de les enregistrer dans le journal. La mise en forme est vraiment triviales (on peut utiliser \t pour le retrait d'un de propriétés d'objets et de ses valeurs):

MyObject
    Property1 = value
    Property2 = value2
    OtherObject
       OtherProperty = value ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X