Какой интерфейс или метод должен реализовать мой класс, чтобы напечатать то, что я хочу, в консоли.WriteLine?
-
06-07-2019 - |
Вопрос
У меня есть объект класса F.Я хочу вывести содержимое объекта с помощью консоли.WriteLine для быстрого и грязного обновления статуса, подобного этому:
Консоль.Строка записи(objectF);
При этом на консоль выводится только имя класса:
F
Я хочу как-то перегрузить это, чтобы вместо этого я мог распечатать некоторую полезную информацию об объекте и его свойствах.
У меня уже есть обходной путь:Чтобы перегрузить метод toString в моем классе, а затем вызвать:Консоль.Строка записи(objectF.toString());
Но я бы предпочел более простой синтаксис.Есть какие-нибудь идеи?
Решение
Консоль.Строка записи(objectF)
Должно сработать, если вы перегружены ToString
.Когда фреймворку необходимо преобразовать объект в строковое представление, он вызывает ToString
.
public override string ToString()
{
// replace the line below with your code
return base.ToString();
}
Другие советы
Вам следует переопределить 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());
Приведенное выше использование отражения не очень хорошо подходит для высокопроизводительного кода, поэтому не используйте его в производственном сценарии, где требуется высокая производительность.
Я бы продолжал использовать toString().В этом его цель существования.Кроме того, если у вас нет строки формата, вы можете просто написать:
Console.WriteLine(objectF)
Я нашел причину своей проблемы.Я забыл определить свою реализацию toString() как переопределение.Правильный синтаксис таков:
public override string ToString()
{
///Do stuff...
return string;
}
Спасибо приведенным ниже плакатам, которые наставили меня на правильный путь