Obtener las propiedades por reflection

07/04/2006 - 16:11 por mmiraglia | Informe spam
Hola a todos.
Necesito obtener las propiedades de un objeto que tiene 3 niveles de
jerarquía. Pero si utilizo reflection en dicho objeto, las propiedades
vienen en un orden extraño y yo las necesito en el orden de
jerarquía:

Class X {
string a;
}

Class Y : X {
string b;
string c;
}

Class Z : Y {
string d;
string e;
}

Y necesitaría algo así:
Z.getPropiedades() > a, b, c, d, e
Cuando si utilizo reflección en Z obtengo:
Z.getPropiedades() > d, e, b, c, a

Muchas gracias!

Preguntas similare

Leer las respuestas

#1 Alberto Poblacion
07/04/2006 - 16:22 | Informe spam
wrote in message
news:
Necesito obtener las propiedades de un objeto que tiene 3 niveles de
jerarquía. Pero si utilizo reflection en dicho objeto, las propiedades
vienen en un orden extraño y yo las necesito en el orden de
jerarquía:
[...]
Y necesitaría algo así:
Z.getPropiedades() > a, b, c, d, e
Cuando si utilizo reflección en Z obtengo:
Z.getPropiedades() > d, e, b, c, a



Una vez que tengas el Type de Z, puedes preguntar por su propiedad
BaseType, que te daría Y, y volviendo a hacer lo mismo vas subiendo en la
jerarquía de clases hasta llegar a Object. Una vez que tienes toda la
jerarquía, puedes ir preguntando por las propiedades de cada clase desde la
primera, con lo que las averiguarías en el orden que quieres.
Respuesta Responder a este mensaje
#2 mmiraglia
09/04/2006 - 17:09 | Informe spam
Claro, a priori estoy haciendo eso. Ahora el problema es que cuando
pregunto por las propiedades de Y, también me trae las de X. Y cuando
pregunto por las de Z también me trae las de X y las de Y.
Desafortunadamente aún no encontré la forma de pedirle las clases
propias y no las heredadas.
Saludos
Respuesta Responder a este mensaje
#3 Alberto Poblacion
09/04/2006 - 20:02 | Informe spam
wrote in message
news:
Desafortunadamente aún no encontré la forma de pedirle las clases
propias y no las heredadas.



El GetProperties() admite un parámetro opcional llamado BindingFlags, y
el BindingFlags admite un valor llamado DeclaredOnly que según el manual
hace que solo se devuelvan los miembros declarados a ese nivel y no los
heredados.
Respuesta Responder a este mensaje
#4 mmiraglia
10/04/2006 - 02:53 | Informe spam
Alberto Poblacion ha escrito:

El GetProperties() admite un parámetro opcional llamado BindingFlags, y
el BindingFlags admite un valor llamado DeclaredOnly que según el manual
hace que solo se devuelvan los miembros declarados a ese nivel y no los
heredados.


Gracias Alberto, pero te muestro mi código con tu agregado:
private PropertyInfo[] MyGetProperties(Type type)
{
if (type.BaseType.Equals(typeof(System.Object)))
{
return type.GetProperties();
}
else
{
PropertyInfo[] pBase = MyGetProperties(type.BaseType);
PropertyInfo[] pActual type.GetProperties(BindingFlags.DeclaredOnly);
PropertyInfo[] ret = new PropertyInfo[pBase.Length +
pActual.Length];
pBase.CopyTo(ret,0);
pActual.CopyTo(ret, pBase.Length);
return ret;
}
}

Al llegar a X (la clase que hereda de System.Object) devuelvo la única
propiedad propiedad. Ahora bien, al terminar la primer recursión y
llegar a pActual obtengo un array vacío. Es decir, que el
type.GetProperties(BindingFlags.DeclaredOnly) de Y no me devuelve
ninguna propiedad.
Saludos.
Respuesta Responder a este mensaje
#5 Alberto Poblacion
10/04/2006 - 08:59 | Informe spam
wrote in message
news:
Al llegar a X (la clase que hereda de System.Object) devuelvo la única
propiedad propiedad. Ahora bien, al terminar la primer recursión y
llegar a pActual obtengo un array vacío.



Prueba asi:

private PropertyInfo[] MyGetProperties(Type type)
{
const BindingFlags bf = BindingFlags.DeclaredOnly |
BindingFlags.Public | BindingFlags.Instance;
if (type.BaseType.Equals(typeof(System.Object)))
{
return type.GetProperties(bf);
}
else
{
PropertyInfo[] pBase = MyGetProperties(type.BaseType);
PropertyInfo[] pActual = type.GetProperties(bf);
PropertyInfo[] ret = new PropertyInfo[pBase.Length +
pActual.Length];
pBase.CopyTo(ret, 0);
pActual.CopyTo(ret, pBase.Length);
return ret;
}
}


Fíjate en que el BindingFlags también hay que pasárselo a la primera
iteración (la de object). Con los flags qe te he puesto solo salen las
propiedades públicas de instancia, pero añadiendo más valores puedes también
sacar las no-públicas y las estáticas.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida