How to determine if a property is inherited or not using reflection?

  • Thread starter Thread starter Mark_google
  • Start date Start date
M

Mark_google

I've tried using TypeDescriptor.GetProperties to get
PropertyDescriptors and I've tried <t>.GetProperties to get
PropertyInfo but I can't figure out how to determine for a given
property whether or not the property in question is inherited from an
ancestor or not.

For that matter, I can't determine the inheritance heirarchy either
(because that would be a workaround to see if my parent has the
property defined).

TIA,
 
I've tried using TypeDescriptor.GetProperties to get
PropertyDescriptors and I've tried <t>.GetProperties to get
PropertyInfo but I can't figure out how to determine for a given
property whether or not the property in question is inherited from an
ancestor or not.
Checking if .DeclaringType is the same as .ReflectedType should do the trick.
For that matter, I can't determine the inheritance heirarchy either
(because that would be a workaround to see if my parent has the
property defined).
The inheritance hierarchy is actually an inheritance chain, since C# doesn't
have multiple inheritance. (Interfaces are "implemented" rather than
"inherited".) Simply following Type.BaseType will do.

Involving interfaces as well makes things trickier because .DeclaringType
will always show that a class declared the property, not an interface.
You'll have to enumerate interfaces and mappings with .GetInterfaces() and
..GetInterfaceMap() for a full picture.
 
Thanks for the reply,
Checking if .DeclaringType is the same as .ReflectedType should do the trick.

I tried that and it seemed to work in most cases - except for one case
where I had a class ButtonControl that inherited an Infragistics
button control and the declaringtype and relfectedtype were my
buttoncontrol. I assumed it had to do w/ being in different
assemblies?
The inheritance hierarchy is actually an inheritance chain, since C# doesn't
have multiple inheritance. (Interfaces are "implemented" rather than
"inherited".) Simply following Type.BaseType will do.

Excellent. Thank you.
You'll have to enumerate interfaces and mappings with .GetInterfaces() and
.GetInterfaceMap() for a full picture.

Thankfully, I can skip that part :)
 
I tried that and it seemed to work in most cases - except for one case
where I had a class ButtonControl that inherited an Infragistics
button control and the declaringtype and relfectedtype were my
buttoncontrol. I assumed it had to do w/ being in different
assemblies?

Ah - this was because I wasn't actually inheriting the property, but
overriding it... duh..
 
digger said:
I tried that and it seemed to work in most cases - except for one case
where I had a class ButtonControl that inherited an Infragistics
button control and the declaringtype and relfectedtype were my
buttoncontrol. I assumed it had to do w/ being in different
assemblies?
That should not make any difference, actually (but I can't say it definitely
shouldn't, since I've never needed to do this). Could you give a minimal
example to reproduce this? Are you certain you actually implemented/overrode
the property and not accidentally declared a new one?
 
Back
Top