So what I have right now is something like this:
PropertyInfo[] info = obj.GetType().GetProperties(BindingFlags.Public);
where obj
is some object.
The problem is some of the properties I want aren't in obj.GetType()
they're in one of the base classes further up. If I stop the debugger and look at obj, the I have to dig through a few "base" entries to see the properties I want to get at. Is there some binding flag I can set to have it return those or do I have to recursively dig through the Type.BaseType
hierarchy and do GetProperties
on all of them?
I would tend to agree with Nicolas; unless you know you need reflection, then
ComponentModel
is a viable alternative, with the advantage that you will get the correct metadata even for runtime models (such asDataView
/DataRowView
).For example:
As an aside, you can also do some simple performance tricks with this; you can do the same with reflection and
Delegate.CreateDelegate
, but there is no centralised place to hide the logic away, unlikeTypeDescriptor
with aTypeDescriptionProvider
(don't worry if these are unfamiliar; you can just use the code "as is" ;-p).Use:
Use this:
EDIT: Of course the correct answer is that of Jay.
GetProperties()
without parameters is equivalent toGetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static )
. TheBindingFlags.FlattenHierarchy
plays no role here.I don't think it's that complicated.
If you remove the
BindingFlags
parameter to GetProperties, I think you get the results you're looking for:produces
If you access
Type.BaseType
, you can get the base type. You can recursively access each base type and you'll know when you've hit the bottom when your type isSystem.Object
.