c# - tipos - ¿Cómo se obtienen todas las propiedades de una clase y sus clases base(en la jerarquía) con Reflection?(DO#)
tipos de clases programacion (5)
Entonces, lo que tengo ahora es algo como esto:
PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public);
donde obj
es un objeto.
El problema es que algunas de las propiedades que quiero no están en obj.GetType()
están en una de las clases base más arriba. Si detengo el depurador y miro obj, tengo que buscar entre algunas entradas "base" para ver las propiedades que quiero obtener. ¿Hay algún indicador de enlace que pueda configurar para que devuelva esos o tengo que buscar de forma recursiva a través de la jerarquía de Type.BaseType
y hacer GetProperties
en todos ellos?
No creo que sea tan complicado.
Si elimina el parámetro BindingFlags
para GetProperties, creo que obtiene los resultados que está buscando:
class B
{
public int MyProperty { get; set; }
}
class C : B
{
public string MyProperty2 { get; set; }
}
static void Main(string[] args)
{
PropertyInfo[] info = new C().GetType().GetProperties();
foreach (var pi in info)
{
Console.WriteLine(pi.Name);
}
}
produce
MyProperty2 MyProperty
Si accede a Type.BaseType
, puede obtener el tipo de base. Puede acceder recursivamente a cada tipo base y sabrá cuándo ha tocado fondo cuando su tipo es System.Object
.
Type type = obj.GetType();
PropertyInfo[] info = type.GetProperties(BindingFlags.Public);
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public);
Utilizar esta:
PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
EDITAR: por supuesto, la respuesta correcta es la de Jay . GetProperties()
sin parámetros es equivalente a GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static )
. La BindingFlags.FlattenHierarchy
no juega ningún papel aquí.
Utilizar:
TypeDescriptor.GetProperties(obj);
Yo tendería a estar de acuerdo con Nicolas; a menos que sepa que necesita reflexión, ComponentModel
es una alternativa viable, con la ventaja de que obtendrá los metadatos correctos incluso para los modelos de tiempo de ejecución (como DataView
/ DataRowView
).
Por ejemplo:
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
}
Como un aparte, también puedes hacer algunos trucos simples de rendimiento con esto; puede hacer lo mismo con reflection y Delegate.CreateDelegate
, pero no hay un lugar centralizado para ocultar la lógica, a diferencia de TypeDescriptor
con TypeDescriptionProvider
(no se preocupe si no le resulta familiar, puede usar el código "tal cual"; -pag).