Получите полное строковое представление объекта (например, в окне Immediate Window в Visual Studio)

Учитывая следующий пример класса:

public class MyClass
{
    public string S { get; set; }
    public int I { get; set; }
    public DateTime D { get; set; }
    private float F { get; set; }
    private long l;

    public MyClass()
    {
        S = "foo";
        I = 42;
        D = new DateTime(2011, 11, 11);
        F = 3.14f;
        l = 12435;
    }
}

Если у меня в приложении есть экземпляр myClass этого класса, перейдите в код в режиме отладки (Visual Studio 2010) и в какой-то момент введите myClass в окно Immediate, появится следующее:

{MyClass}
    D: {11.11.2011 00:00:00}
    F: 3.14
    I: 42
    l: 12435
    S: "foo"

Получение такого строкового представления объекта и всех его значений может быть очень полезно для целей ведения журнала. Есть ли хороший и простой способ достичь этого?

Я предполагаю, что Immediate Window использует отражение для цикла по всем полям и свойствам, но я думал, что попрошу на случай, если уже существует какая-то функция полезности или что-то в этом роде.

Ответ 1

Это сохранит все поля в словаре (чтобы их можно было прочитать первым):

public static Dictionary<string, object> GeneratePropertiesDictionary(object myClass)
{
    return myClass.GetType()
                  .GetProperties()
                  .Where(p => p.CanRead)
                  .ToDictionary(p => p.Name, p => p.GetValue(myClass, null));
}

Вы можете легко изменить это, чтобы добавить каждое имя/значение к объекту StringBuilder вместо словаря, но дамп в файл.

Ответ 2

Если вы хотите сериализованную версию объекта, я бы, вероятно, использовал JavaScriptSerializer в вашем протоколе:

public void LogObject(object obj)
{
    var serializer = new JavaScriptSerializer();
    var objString = serializer.Serialize(obj);

    WriteLog(objString);
}

Ответ 3

Вы можете использовать Reflection и перебирать все поля и свойства, вызывая ToString() для каждого результата. Если текущее поле/свойство является классом/структурой, вы можете сделать это рекурсивно, если хотите.

Во-вторых, некоторые классы используют DebuggerDisplayAttribute, хотя вам нужно будет проанализировать этот AFAICT.

Ответ 4

Если вы хотите просто зарегистрировать (т.е. напечатать) представление объекта, переопределите метод ToString.

ToString является основным методом форматирования в .NET Framework. Он преобразует объект в его строковое представление, так что он подходит для отображения.

Кроме того, если вы хотите предоставить несколько способов вывода строки (например, для поддержки подробного или минимального варианта), вы также можете изучить реализацию IFormattable.