web-dev-qa-db-ja.com

Reflectionを使用して、クラスとその基本クラス(階層の上位)のすべてのプロパティを取得するにはどうすればよいですか? (C#)

だから私が今持っているのはこのようなものです:

_PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public);
_

ここで、objはオブジェクトです。

問題は、必要なプロパティの一部がobj.GetType()になく、さらに上の基本クラスの1つにあることです。デバッガーを停止してobjを見ると、取得したいプロパティを確認するために、いくつかの「ベース」エントリを掘り下げる必要があります。それらを返すように設定できるバインディングフラグはありますか、それとも_Type.BaseType_階層を再帰的に掘り下げて、それらすべてに対してGetPropertiesを実行する必要がありますか?

26
Davy8

これを使って:

_PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
_

編集:もちろん、正解は Jay の答えです。パラメータなしのGetProperties()は、GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static )と同等です。 _BindingFlags.FlattenHierarchy_はここでは何の役割も果たしません。

25
Panos

それほど複雑ではないと思います。

GetPropertiesのBindingFlagsパラメータを削除すると、探している結果が得られると思います。

    class B
    {
        public int MyProperty { get; set; }
    }

    class C : B
    {
        public string MyProperty2 { get; set; }
    }

    static void Main(string[] args)
    {
        PropertyInfo[] info = new C().GetType().GetProperties();
        foreach (var pi in info)
        {
            Console.WriteLine(pi.Name);
        }
    }

を生成します

 MyProperty2 
 MyProperty 
15
Jay Bazuzi

Type.BaseTypeにアクセスすると、基本型を取得できます。各基本タイプに再帰的にアクセスでき、タイプがSystem.Objectのときに、いつ最下位に到達したかがわかります。

Type type = obj.GetType();
PropertyInfo[] info = type.GetProperties(BindingFlags.Public);
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public);
5
Seibar

私はニコラスに同意する傾向があります。リフレクションが必要であることがわかっていない限り、ComponentModelは実行可能な代替手段であり、ランタイムモデル(DataView/DataRowViewなど)でも正しいメタデータを取得できるという利点があります。 。

例えば:

    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
    {
        Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
    }

余談ですが、これを使って簡単な パフォーマンストリック を実行することもできます。リフレクションとDelegate.CreateDelegateでも同じことができますが、TypeDescriptorTypeDescriptionProviderの場合とは異なり、ロジックを隠すための集中化された場所はありません(これらがなじみのない場合でも心配しないでください) ;コードを「そのまま」使用できます;-p)。

3
Marc Gravell

使用する:

TypeDescriptor.GetProperties(obj);
2