クラスのリフレクションプロパティで取得しますが、継承されたクラスからは取得しません


80
class Parent {
   public string A { get; set; }
}

class Child : Parent {
   public string B { get; set; }
}

プロパティAなしで、プロパティBのみを取得する必要がありますが

Child.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)

両方のプロパティを返します:/

回答:


155

BindingFlags.DeclaredOnlyをフラグに追加する必要があります。

typeof(Child).GetProperties(System.Reflection.BindingFlags.Public
    | System.Reflection.BindingFlags.Instance
    | System.Reflection.BindingFlags.DeclaredOnly)

2
これは逆にできますか?Parent.GetProperties()を実行し、特定のオブジェクトが子に継承されている場合は、親と子からすべてのプロパティを取得します
Maiko Kingma 2016

10

DeclaredOnlyバインディングフラグを使用してみてください。返されるプロパティを、関心のあるクラスで宣言されているプロパティのみに制限する必要があります。コードサンプルは次のとおりです。

PropertyInfo[] properties = typeof(Child).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.DeclaredOnly);


4

Type.csから :この場合、DeclaredOnlyLookupを使用します

  private const BindingFlags DefaultLookup = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public;
  internal const BindingFlags DeclaredOnlyLookup = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.DeclaredOnly;

1
興味深いことに、このアプローチを使用して、独自のconstBindingFlagsを定義します。ソースコードを調べるための+1。
C. Tewalt 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.