2

私は以下のようなクラスを持っています:

Class A : B<C>
{
    public A(C entity):base(entity)
    {}
}

abstract class B<T>
{
    public B(T entity)
        {
            Entity = entity;
        }

        public T Entity { get; private set; }
}

Class C: D
{
    public string prop2{get;set;}
}
Class D
{
    public string prop1{get;set;}
}
 Main()
 {
 A obj = new A(new C());
 obj.GetType().GetProperty("prop1",  BindingsFlag.Instance|BindingsFlag.FlatteredHierarchy)//  is null


 }

クラス A のオブジェクトがあります。実行時にこのオブジェクトからプロパティ値を取得したいと考えています。

私は試しています

obj.GetType().GetProprty("propertyName", 
                         BindingsFlag.FlattenHierarchy).GetValue(obj, null);

ただし、そのプロパティは D または C クラスで宣言されているため、GetProprty() は null を返します。

誰かがこれを達成する方法を教えてもらえますか?

前もって感謝します。

4

1 に答える 1

3
GetType().GetProperty("propertyName", BindingsFlag.FlattenHierarchy)
         .GetValue(obj, null);

インスタンスまたは静的プロパティのどちらを取得するかを指定するバインディング フラグがありません:

 BindingsFlag.FlattenHierarchy | BindingsFlag.Instance

MSDNフラグによると、null 以外の値を取得するには、明示的に指定する必要がありますBindingsFlag.InstanceBindingsFlag.Static

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

さらに、publicプロパティはデフォルトで除外されています。したがって、プロパティがpublic 追加のフラグを指定する必要がある場合:

BindingsFlag.FlattenHierarchy | BindingsFlag.Instance | BindingsFlag.Public

備考:

検索にパブリック プロパティを含めるには、BindingFlags.Public を指定します。

ベースのプロパティがプライベートである場合、FlattenHierarchyそれを列挙しません:

(...) 継承されたクラスのプライベートな静的メンバーが含まれていない場合は、基本クラスを手動で移動してそのプロパティを検索する必要があります。

プロパティ名が有効で存在することも確認してください。

編集: 編集後、問題が発生しました。クラス A は D クラスのサブクラスではありません (D クラスからプロパティを取得したい)。そのため、プロパティ値の取得はこのようには機能しません。次の手順に従う必要があります。

// get entity prop value
var entityValue =
    (obj.GetType()
        .GetProperty("Entity", 
           BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.Public)
        .GetValue(obj));
// get prop value
var prop1Value =
    entityValue.GetType()
               .GetProperty("prop1", 
                  BindingFlags.FlattenHierarchy | 
                  BindingFlags.Instance | 
                  BindingFlags.Public)
               .GetValue(entityValue);

null値などを処理することを忘れないでください。

于 2015-03-02T10:22:18.503 に答える