Подтвердить что ты не робот

Как узнать, унаследовано ли свойство от базового класса или объявлено в производном?

У меня есть класс, который получен из абстрактного класса. Получение типа производного класса Я хочу узнать, какие свойства наследуются от абстрактного класса и которые были объявлены в производном классе.

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"
};

Итак, я хотел бы быстро узнать, что CommonParam является унаследованным параметром, а Id, Name - это параметры, объявленные в MsClass. Любые предложения?

Попытка использования объявленного только флага возвращает мне пустой массив PropertyInfo

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

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

Однако GetProperties() возвращает все свойства иерархии наследования.

type.GetProperties()

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

Я что-то пропустил?

4b9b3361

Ответ 1

Вы можете указать Type.GetProperties ( BindingFlags.DeclaredOnly ), чтобы получить свойства которые определены в производном классе. Если вы затем вызываете GetProperties в базовом классе, вы можете получить свойства, определенные в базовом классе.


Чтобы получить общедоступные свойства из вашего класса, вы можете сделать:

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

Ответ 2

Вы можете проверить на основе DeclaringType, как показано ниже:

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

Чтобы получить свойства из базового класса, вы можете вызвать аналогично:

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

Ответ 3

Это может помочь:

Type type = typeof(MsClass);

Type baseType = type.BaseType;

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