だから私が今持っているのはこのようなものです:
_PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public);
_
ここで、obj
はオブジェクトです。
問題は、必要なプロパティの一部がobj.GetType()
になく、さらに上の基本クラスの1つにあることです。デバッガーを停止してobjを見ると、取得したいプロパティを確認するために、いくつかの「ベース」エントリを掘り下げる必要があります。それらを返すように設定できるバインディングフラグはありますか、それとも_Type.BaseType
_階層を再帰的に掘り下げて、それらすべてに対してGetProperties
を実行する必要がありますか?
これを使って:
_PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
_
編集:もちろん、正解は Jay の答えです。パラメータなしのGetProperties()
は、GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static )
と同等です。 _BindingFlags.FlattenHierarchy
_はここでは何の役割も果たしません。
それほど複雑ではないと思います。
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
Type.BaseType
にアクセスすると、基本型を取得できます。各基本タイプに再帰的にアクセスでき、タイプがSystem.Object
のときに、いつ最下位に到達したかがわかります。
Type type = obj.GetType();
PropertyInfo[] info = type.GetProperties(BindingFlags.Public);
PropertyInfo[] baseProps = type.BaseType.GetProperties(BindingFlags.Public);
私はニコラスに同意する傾向があります。リフレクションが必要であることがわかっていない限り、ComponentModel
は実行可能な代替手段であり、ランタイムモデル(DataView
/DataRowView
など)でも正しいメタデータを取得できるという利点があります。 。
例えば:
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
}
余談ですが、これを使って簡単な パフォーマンストリック を実行することもできます。リフレクションとDelegate.CreateDelegate
でも同じことができますが、TypeDescriptor
とTypeDescriptionProvider
の場合とは異なり、ロジックを隠すための集中化された場所はありません(これらがなじみのない場合でも心配しないでください) ;コードを「そのまま」使用できます;-p)。
使用する:
TypeDescriptor.GetProperties(obj);