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

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,
 
J

Jeroen Mostert

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.
 
D

digger

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 :)
 
D

digger

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..
 
J

Jeroen Mostert

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?
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top