Подтвердить что ты не робот

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

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

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

Property 1: Value of property 1\n
Property 2: Value of property 2\n
...

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

4b9b3361

Ответ 1

Думаю, вы можете немного подумать. Посмотрите 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();
}

Ответ 2

@Oliver отвечает как метод расширения (который, как мне кажется, подходит)

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

typeof(YourClass).GetProperties()