9

リフレクションを使用して継承されたプロパティ値を取得するにはどうすればよいですか?試してみますがBindingFlags、それでもトリガーしますNullReferenceException

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

position継承されたパブリックプロパティであり、宣言された値があります。

編集:

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といくつかの組み合わせを試しましたが、p常にnullです:(、

4

2 に答える 2

17

でオーバーロードを使用する場合BindingFlagsは、関心のあるすべてのフラグを明示的に指定する必要があります。

また、次の点にも注意してください:(MSDNから)

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

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

編集:

プロパティではなくposition フィールドがあります!。

(違いを学び始めるのに適した場所:C#3.0+のプロパティとフィールドの違い、特にこの回答

positionプロパティに変更します。

public float[] position { get; set; }

または、targetObject.GetType().GetField(...メソッドを使用してフィールドを取得します。

于 2012-09-08T11:22:05.087 に答える
3
BindingFlags.FlattenHierarchy

静的メンバーに対してのみ機能します。必ず指定してください

BindingFlags.Instance | BindingFlags.Public

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

于 2012-09-08T11:24:38.653 に答える