2012-09-08 22 views
7

リフレクションを使用して継承プロパティ値を取得する方法は?私はBindingFlagsと試みるが、まだNullReferenceExceptionリフレクションを使用して継承プロパティの値を取得する方法は?

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

positionをトリガー は、パブリックプロパティをiheritedと宣言された値を持っています。

編集:私はいくつかのBindingFlagsとの組み合わせが、p常に:(ヌルであるとしようとした

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

、あなたはBindingFlagsでオーバーロードを使用している場合は、明示的にすべてのフラグを指定する必要が

+2

投稿できますか?継承されたプロパティを含むクラス? –

+0

今見てください。 – abuduba

+0

@abuduba最新の回答を見る – nemesv

答えて

11

何あなたは興味があります。

また、(MSDNから)

01から

戻り値を取得するには、BindingFlags.InstanceまたはBindingFlags.Static のいずれかを指定する必要があります。

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

EDIT:

あなたはpositionフィールドないプロパティを持っています!。

(違いを学習を開始するには良い場所:Difference between Property and Field in C# 3.0+特にこのanswer

は、プロパティに、あなたの positionを変更

public float[] position { get; set; } 

それともフィールドを取得するtargetObject.GetType().GetField(...メソッドを使用します。

1
BindingFlags.FlattenHierarchy 

は、静的メンバーに対してのみ機能します。

BindingFlags.Instance | BindingFlags.Public 

を必ず指定し、継承されたプロパティを取得する必要があります。

関連する問題