web-dev-qa-db-fra.com

Une façon d'imprimer un objet C #

J'ai une zone de texte et je veux y afficher un objet C # d'une manière lisible par l'homme, juste pour des raisons de débogage. Je ne veux pas utiliser de bibliothèques externes si possible. Comment puis-je faire cela?

51
Hui

Sérialisez-le en JSON. Cela peut être fait dans la méthode ToString() comme d'autres l'ont suggéré, mais je ne pense pas que ce soit approprié si vous allez l'utiliser uniquement pour le débogage.

20
Ilia G

Si vous utilisez Json, je suggérerais d'utiliser la bibliothèque Json de Newtonsofts, puis vous pouvez générer l'intégralité de l'objet en notation Json et le formatera avec un espacement et des sauts de ligne. nous l'avons utilisé pour afficher facilement des objets complexes à des fins de débogage:

var jsonString = JsonConvert.SerializeObject(
           property, Formatting.Indented,
           new JsonConverter[] {new StringEnumConverter()});

ici, j'ai également utilisé le convertisseur String Enum afin d'afficher Enums comme leur représentation de chaîne plutôt que comme un entier.

La bibliothèque est disponible via NuGet en tant que Json.Net ou Newtonsoft Json

Ou vous pouvez l'obtenir ici:

http://james.newtonking.com/pages/json-net.aspx

89
Richard

Si c'est juste à des fins de débogage, utilisez DebuggerDisplayAttribute .

L'utilisation de cet attribut changera l'apparence de l'objet dans la section Valeur de la fenêtre de surveillance (ou lors du survol pendant le débogage)

usage:

[DebuggerDisplay("Name = {FirstName} {LastName}")]
public class Person {
  public string FirstName { get; set; }
  public string LastName { get; set; }

}
23
vt100

j'ai aussi utilisé Json pendant un certain temps; mais maintenant j'ai créé un PrettyPrint-Minimod . Vous pouvez l'ajouter via Nuget (il s'agit d'une distribution Sourcecode). Découvrez ce qu'est un Minimod ici.

Il imprime joliment les graphiques d'objets et a de la magie pour les énumérables et les dictionnaires. Il essaie également de trouver des sauts de ligne appropriés.

Je vais bientôt bloguer à ce sujet - mais allez-y et essayez-le :-)

5
Lars Corneliussen

Un moyen facile et simple consiste à remplacer la méthode ToString .

Voici un lien: Comment remplacer ToString

5
Gustavo Mori
  1. Install-Package ServiceStack.Text
  2. obj.Dump();

Si vous ne souhaitez pas utiliser de bibliothèques externes, écrivez votre propre méthode d'extension Dump ().

2
Alexander Logger

Remplacez simplement ToString() sur votre type et fournissez votre propre chaîne formatée pour l'affichage de débogage.

1
Ed S.

J'utilise cela un peu pour remplir les zones de liste avec des objets personnalisés:

public override string ToString()
{
    return String.Format("{0}:{1}:{2}", Property1, Property2, Property3);
}
1
Jon

Cela a fonctionné très gentiment pour moi:

string SerilizedText = "";
RootClass myclass= new Root RootClass ();
SerilizedText = JsonConvert.SerializeObject(myclass,Formatting.Indented) ;
1
maria

Substituez la méthode .ToString().

0
Jay