2012-09-08 31 views
7

¿Cómo obtener el valor de propiedad heredado mediante reflexión? Trato con BindingFlags pero aún desencadenar NullReferenceException¿Cómo obtener el valor de la propiedad heredada mediante la reflexión?

object val = targetObject.GetType().GetProperty("position", BindingFlags.FlattenHierarchy).GetValue(targetObject, null); 

position se iherited propiedad pública y tiene un valor declarado.

EDIT:

class myParent 
{ 
    public float[] position; 
    public myParent() 
    { 
     this.position = new float[] { 1, 2, 3 }; 
    } 
} 

class myChild : myParent 
{ 
    public myChild() : base() { } 
} 

myChild obj = new myChild(); 
PropertyInfo p = obj.GetType().GetProperty("position", BindingFlags.Instance | BindingFlags.Public); 

Probé con varias combinaciones con BindingFlags pero p siempre es nulo :(,

+2

¿Podría publicar una clase que contenga una propiedad heredada? –

+0

Echa un vistazo ahora. – abuduba

+0

@abuduba ver mi respuesta actualizada – nemesv

Respuesta

11

Si utiliza la sobrecarga con BindingFlags tiene que especificar explícitamente todas las banderas lo usted está interesado.

También tenga en cuenta que: (de MSDN)

Debe especificar BindingFlags.Instance o BindingFlags.Static para obtener una devolución.

object val = targetObject.GetType() 
      .GetProperty("position", 
          BindingFlags.FlattenHierarchy | 
          BindingFlags.Instance | 
          BindingFlags.Public) 
      .GetValue(targetObject, null); 

EDIT:

tiene un campopositionno es una propiedad !.

(Un buen lugar para comenzar a aprender la diferencia: Difference between Property and Field in C# 3.0+ especialmente este answer)

Cambiar la position a una propiedad:

public float[] position { get; set; } 

O utiliza el método targetObject.GetType().GetField(... para recuperar el campo.

1
BindingFlags.FlattenHierarchy 

funciona solo para miembros estáticos. Asegúrese de especificar

BindingFlags.Instance | BindingFlags.Public 

y debe obtener las propiedades heredadas.

Cuestiones relacionadas