Какой интерфейс или метод должен реализовать мой класс для печати того, что я хочу в Console.WriteLine? - PullRequest
1 голос
/ 09 октября 2008

У меня есть объект класса F. Я хочу вывести содержимое объекта с помощью Console.WriteLine для быстрого и грязного обновления состояния, например:

еЫп (objectF);

Это выводит на консоль только имя класса:

F

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

У меня уже есть обходной путь: перегрузить метод ToString в моем классе и затем вызвать: ЕЫпе (objectF.ToString ());

Но я бы предпочел более простой синтаксис. Есть идеи?

Ответы [ 4 ]

6 голосов
/ 09 октября 2008

Console.WriteLine (objectF)

Должно работать, если вы перегружены ToString. Когда платформе необходимо преобразовать объект в строковое представление, он вызывает ToString.

public override string ToString()
{
    // replace the line below with your code
    return base.ToString();
}
2 голосов
/ 10 октября 2008

Вы должны переопределить ToString (), хотя в некоторых ситуациях может оказаться полезным следующий код:

public static class ObjectUtility
{
    public static string ToDebug(this object obj)
    {
        if (obj == null)
            return "<null>";

        var type = obj.GetType();
        var props = type.GetProperties();

        var sb = new StringBuilder(props.Length * 20 + type.Name.Length);
        sb.Append(type.Name);
        sb.Append("\r\n");

        foreach (var property in props)
        {
            if (!property.CanRead)
                continue;
            // AppendFormat defeats the point
            sb.Append(property.Name);
            sb.Append(": ");
            sb.Append(property.GetValue(obj, null));
            sb.Append("\r\n");
        }

        return sb.ToString();
    }
}

Использование заключается в том, чтобы просто включить пространство имен, содержащее ObjectUtility, а затем ...

var f = new F();
Console.WriteLine(f.ToDebug());

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

1 голос
/ 09 октября 2008

Я нашел причину своей проблемы. Я пренебрег определением моей реализации ToString () как override . Правильный синтаксис:

public override string ToString()
{
   ///Do stuff...
   return string;
}

Благодаря постерам ниже, которые поставили меня на правильный путь

1 голос
/ 09 октября 2008

Я бы продолжил использовать ToString (). Это его цель для существования. Кроме того, если у вас нет строки формата, вы можете просто написать:

Console.WriteLine(objectF)
...