Ответ Джона идеален - только одно замечание: как часть общего плана я бы:
- обычно избегать отражения
непубличные участники
- избегать открытых полей (почти всегда)
Результатом этих двух явлений является то, что , как правило, , вам нужно только отражать общие свойства (вы не должны вызывать методы, если не знаете, что они делают; методы получения свойств ожидаются быть идемпотентом [отложенная загрузка]). Так что для PropertyInfo
это просто prop.GetValue(obj, null);
.
На самом деле, я большой поклонник System.ComponentModel
, поэтому я хотел бы использовать:
foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
}
или для определенного свойства:
PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["SomeProperty"];
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
Одним из преимуществ System.ComponentModel
является то, что он будет работать с абстрактными моделями данных, например, как DataView
представляет столбцы как виртуальные свойства; есть и другие приемы (например, приемы повышения производительности ).