respuesta de Jon es ideal - sólo una observación: como parte del diseño general, lo haría:
- general evitar que refleja contra miembros no públicos
- evitar tener campos públicos (casi siempre)
El resultado de estos dos es que general sólo es necesario para reflejar contra propiedades públicas (que no debe llamar a métodos a menos que sepas lo que hacen; los captadores de propiedad son esperado ser idempotente [lazy loading beside]). Entonces, para un PropertyInfo
esto es solo prop.GetValue(obj, null);
.
En realidad, soy un gran fan de System.ComponentModel
, por lo que estaría tentado a usar:
foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
}
o para una propiedad específica:
PropertyDescriptor prop = TypeDescriptor.GetProperties(obj)["SomeProperty"];
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
Una ventaja de System.ComponentModel
es que se trabajará con modelos de datos abstraídos, como por ejemplo cómo DataView
expone columnas como propiedades virtuales; También hay otros trucos (como performance tricks).
gracias Jon - podría dar un ejemplo a partir de un objeto MemberInfo sin embargo? –
¿De qué tipo? MemberInfos puede ser propiedades, campos, métodos, eventos u otros tipos. No puedes tratarlos todos de la misma manera. ¿Cuál sería el "valor" de un tipo anidado, por ejemplo? Tal vez deberías decirnos más sobre tu problema. –
muy mal GetValue/SetValue no era una interfaz con la que se pudiera comparar. –