28

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

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

objあるオブジェクトはどこにありますか。

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

4

5 に答える 5

29

これを使って:

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

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

于 2008-10-28T22:27:34.487 に答える
16

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

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

生産する

    マイ プロパティ 2
    私の所有物
于 2008-10-28T22:32:41.420 に答える
6

にアクセスするType.BaseTypeと、基本型を取得できます。各基本型に再帰的にアクセスでき、型がSystem.Object.

Type type = obj.GetType();
PropertyInfo[] info = type.GetProperties(BindingFlags.Public);
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public);
于 2008-10-28T22:22:50.613 に答える
3

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

例えば:

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

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

于 2008-10-28T22:43:29.807 に答える
2

使用する:

TypeDescriptor.GetProperties(obj);
于 2008-10-28T22:35:20.183 に答える