Как автоматически отображать все свойства класса и их значения в строке?
Представьте себе класс со многими общедоступными свойствами. По какой-то причине невозможно преобразовать этот класс в более мелкие подклассы.
Я хотел бы добавить переопределение ToString, которое возвращает что-то вдоль строк:
Property 1: Value of property 1\n
Property 2: Value of property 2\n
...
Есть ли способ сделать это?
Ответы
Ответ 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()