Maxim
Maxim

Reputation: 4214

How to find out if property is inherited from a base class or declared in derived?

I have a class that is derived from an abstract class. Getting a type of a derived class I want to find out which properties are inherited from abstract class and which were declared in the derived class.

public abstract class BaseMsClass
{
    public string CommonParam { get; set; }
}

public class MsClass : BaseMsClass
{
    public string Id { get; set; }
    public string Name { get; set; }

    public MsClass()
    { }
}

var msClass = new MsClass
{
    Id = "1122",
    Name = "Some name",
    CommonParam = "param of the base class"
};

So, I would like to quickly find out that CommonParam is an inherited parameter and Id, Name are params declared in MsClass. Any suggestions?

Attempt to use declared only flag returns me empty PropertyInfo array

Type type = msClass.GetType();
type.GetProperties(System.Reflection.BindingFlags.DeclaredOnly)

-->{System.Reflection.PropertyInfo[0]}

However, GetProperties() returns all properties of inheritance hierarchy.

type.GetProperties()

-->{System.Reflection.PropertyInfo[3]}
-->[0]: {System.String Id}
-->[1]: {System.String Name}
-->[2]: {System.String CommonParam}

Did I miss something?

Upvotes: 24

Views: 19539

Answers (3)

Reed Copsey
Reed Copsey

Reputation: 564333

You can specify Type.GetProperties(BindingFlags.DeclaredOnly) to get the properties that are defined in the derived class. If you then call GetProperties on the base class, you can get the properties defined in the base class.


In order to fetch the public properties from your class, you could do:

var classType = typeof(MsClass);
var classProps = classType.GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
var inheritedProps = classType.BaseType.GetProperties(BindingFlags.Public | BindingFlags.Instance);

Upvotes: 32

Hossein Narimani Rad
Hossein Narimani Rad

Reputation: 32481

This may helps:

Type type = typeof(MsClass);

Type baseType = type.BaseType;

var baseProperties = 
     type.GetProperties()
          .Where(input => baseType.GetProperties()
                                   .Any(i => i.Name == input.Name)).ToList();

Upvotes: 3

cuongle
cuongle

Reputation: 75296

You can check based on the DeclaringType as below:

var pros = typeof(MsClass).GetProperties()
                          .Where(p => p.DeclaringType == typeof(MsClass));

To get properties from base class you can call similarly:

var pros = typeof(MsClass).GetProperties()
                          .Where(p => p.DeclaringType == typeof(BaseMsClass));

Upvotes: 16

Related Questions