Как автоматически отобразить все свойства класса и их значения в строке?
Представьте себе класс со многими общедоступными свойствами. По некоторым причинам невозможно преобразовать этот класс в меньшие подклассы.
Я хотел бы добавить переопределение 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()