From: Mark_google on
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,
From: Jeroen Mostert on
Mark_google(a)nadigs.net wrote:
> 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.

--
J.
http://symbolsprose.blogspot.com
From: digger on
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 :)
From: digger on
> 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..