Какой интерфейс или метод должен реализовать мой класс, чтобы напечатать то, что я хочу, в консоли.Писательская линия?

#c# #.net #console-application #console.writeline

Вопрос:

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

Приставка.Линия записи(objectF);

При этом на консоль выводится только имя класса:

 F
 

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

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

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

Ответ №1:

Приставка.Линия записи(objectF)

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

 public override string ToString()
{
    // replace the line below with your code
    return base.ToString();
}
 

Ответ №2:

Вы должны переопределить 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("rn");

        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("rn");
        }

        return sb.ToString();
    }
}
 

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

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

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

Ответ №3:

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

 Console.WriteLine(objectF)
 

Ответ №4:

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

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

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