Получить полное строковое представление объекта (как в «Немедленном окне» в Visual Studio) - PullRequest
12 голосов
/ 14 июля 2011

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

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 Window, отобразится следующее:

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

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

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

Ответы [ 4 ]

12 голосов
/ 14 июля 2011

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

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 Объект вместо словаря, и сбросить его в файл.

3 голосов
/ 14 июля 2011

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

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

    WriteLog(objString);
}
1 голос
/ 14 июля 2011

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

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

0 голосов
/ 14 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...