Как автоматически отобразить все свойства класса и их значения в строке?

Представьте себе класс со многими общедоступными свойствами. По некоторым причинам невозможно преобразовать этот класс в меньшие подклассы.

Я хотел бы добавить переопределение ToString, которое возвращает что-то вроде:

Свойство 1: стоимость имущества 1\n
Свойство 2: Стоимость имущества 2\n
...

Есть ли способ сделать это?

5 ответов

Решение

Я думаю, что вы можете использовать небольшое отражение здесь. Взгляни на Type.GetProperties(),

private PropertyInfo[] _PropertyInfos = null;

public override string ToString()
{
    if(_PropertyInfos == null)
        _PropertyInfos = this.GetType().GetProperties();

    var sb = new StringBuilder();

    foreach (var info in _PropertyInfos)
    {
        var value = info.GetValue(this, null) ?? "(null)";
        sb.AppendLine(info.Name + ": " + value.ToString());
    }

    return sb.ToString();
}

@ Ответ Оливера как метод расширения (который, я думаю, ему подходит)

public static string PropertyList(this object obj)
{
  var props = obj.GetType().GetProperties();
  var sb = new StringBuilder();
  foreach (var p in props)
  {
    sb.AppendLine(p.Name + ": " + p.GetValue(obj, null));
  }
  return sb.ToString();
}

Вы можете сделать это с помощью отражения.

PropertyInfo[] properties = MyClass.GetType().GetProperties();
foreach(PropertyInfo prop in properties)
{
...
}

Вы можете черпать вдохновение из более сложной интроспекции состояния из интроспектора класса пакета StatePrinter

Если у вас есть доступ к коду нужного вам класса, вы можете просто переопределить ToString() метод. Если нет, то вы можете использовать Reflections для чтения информации из объекта Type:

typeof(YourClass).GetProperties()
Другие вопросы по тегам