2012-09-08 15 views
7

Jak uzyskać odziedziczoną wartość właściwości za pomocą odbicia? próbuję z BindingFlags ale nadal wyzwalać NullReferenceExceptionJak uzyskać wartość odziedziczonej własności za pomocą odbicia?

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

position jest iherited własność publiczną i ma zadeklarowaną wartość.

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); 

Próbowałem z kilkoma kombinacjami z BindingFlags ale p zawsze jest null :(,

+2

Czy mógłbyś opublikować klasę, która zawiera odziedziczoną własność? –

+0

Zobacz teraz. – abuduba

+0

@abuduba zobacz moją zaktualizowaną odpowiedź – nemesv

Odpowiedz

11

Jeśli używasz przeciążenie z BindingFlags trzeba wyraźnie określić wszystkie flagi, co Jesteś zainteresowany

Należy również pamiętać, że: (od MSDN)

Musisz podać BindingFlags.Instance lub BindingFlags.Static , aby uzyskać zwrot.

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

EDIT:

Masz positionpole nie nieruchomość!.

(Dobrym miejscem do rozpoczęcia nauki różnicę: Difference between Property and Field in C# 3.0+ zwłaszcza ten answer)

zmienić position do nieruchomości:

public float[] position { get; set; } 

Albo użyć metody targetObject.GetType().GetField(... odzyskać pole.

1
BindingFlags.FlattenHierarchy 

działa tylko dla członków statycznych. Upewnij się, że podałeś

i powinieneś otrzymać odziedziczone właściwości.

Powiązane problemy