Способ красиво напечатать объект C #

#c# #pretty-print

#c# #красивая печать

Вопрос:

У меня есть текстовое поле, и я хочу отобразить в нем объект C # в удобочитаемом виде, просто из соображений отладки. Я не хочу использовать внешние библиотеки, если это возможно. Как мне это сделать?

Комментарии:

1. Что вы подразумеваете под отображением объекта C #? Отобразить его полное имя, его свойства или что?

Ответ №1:

Если вы используете Json, то я бы посоветовал использовать библиотеку Json Newtonsofts, и тогда вы сможете вывести весь объект в нотации Json, и он отформатирует его с интервалами и разрывами строк. мы использовали это для удобного отображения сложных объектов в целях отладки:

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

здесь я также использовал конвертер перечислений строк, чтобы отображать перечисления в виде их строкового представления, а не в виде целого числа.

Библиотека доступна через NuGet в формате Json.Net или Newtonsoft Json

Или вы можете получить его здесь:

https://www.newtonsoft.com/json

Комментарии:

1. Отличный ответ и пример работает, но вызов объекта для сериализации property вводит в заблуждение. Или, может быть, я что-то упускаю?

Ответ №2:

Если это просто для целей отладки, используйте DebuggerDisplayAttribute.

Использование этого атрибута изменит внешний вид объекта в разделе значений окна просмотра (или при наведении курсора мыши во время отладки)

использование:

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

}
  

Ответ №3:

Сериализуйте его в JSON. Это можно сделать ToString() методом, как предлагали другие, но я не думаю, что это уместно, если вы собираетесь использовать это только для отладки.

Комментарии:

1. На самом деле мне нравится эта идея больше, чем свернуть собственную toString() . сериализация JSON покажет каждое общедоступное поле и его значение в гораздо «более легком» формате, чем XML, не затрагивая toString, который может использоваться в другом месте. Вот простой метод расширения toJSON: weblogs.asp.net/scottgu/archive/2007/10/01 /…

2. здесь был бы полезен быстрый и грязный пример, тем более что это может понадобиться новичкам в языке больше всего!

3. JsonConvert can от Newtonsoft также имеет параметры форматирования Debug.WriteLine(JsonConvert.SerializeObject(myObject, Formatting.Indented))

4. Я использую красиво напечатанные объекты в утверждениях модульного теста. Это быстрый способ (вырезать и вставить) утверждать, что все поля присутствуют и имеют определенное значение. Огромное ускорение в производстве модульных тестов.

Ответ №4:

Для меня это сработало очень хорошо:

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

Ответ №5:

Простой способ — переопределить ToString метод.

Вот ссылка: Как переопределить ToString

Ответ №6:

я также некоторое время использовал Json; но теперь я создал PrettyPrint-Minimod. Вы можете добавить его через Nuget (это дистрибутив исходного кода). Узнайте, что такое минимод, здесь.

Он красиво печатает графики объектов и обладает некоторой магией для перечислимых значений и словарей. Он также пытается определить правильные разрывы строк.

Я скоро напишу об этом в блоге — но просто продолжайте и попробуйте 🙂

Ответ №7:

Просто переопределите ToString() свой тип и предоставьте свою собственную форматированную строку для отображения при отладке.

Ответ №8:

Я использую это довольно часто для заполнения полей списка пользовательскими объектами:

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

Ответ №9:

  1. Установите-Package ServiceStack.Текст
  2. obj.Dump();

Если вы не хотите использовать внешние библиотеки, напишите свой собственный метод расширения Dump().

Комментарии:

1. obj.ToDump() позволяет VS найти правильный пакет, который поможет вам использовать, включает

Ответ №10:

Переопределите .ToString() метод.

Комментарии:

1. Избегайте решений, основанных только на коде. Объясните с помощью ссылки / описания, поскольку OP может быть неопытным программистом