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

У меня есть два класса (модели), один из которых - базовый класс, а другой - подкласс:

public class BaseClass
{    
     public string BaseProperty{get;set;}    
}

public class ChildClass: BaseClass    
{    
     public string ChildProperty{get;set;}    
}

В приложении я вызываю ChildClass динамически, используя generics

List<string> propertyNames=new List<string>();
foreach (PropertyInfo info in typeof(T).GetProperties())
{
      propertyNames.Add(info.Name);
}

Здесь, в списке propertyNames, я получаю свойство для BaseClass. Я хочу только те свойства, которые находятся в классе child. Возможно ли это?

Что я пробовал?

  • Попробовал исключить его, как указано в этом question
  • Попробовал определить, является ли класс подклассом или базовым классом, как указано здесь, но это тоже не помогает.

Ответ 1

Вы можете попробовать это

foreach (PropertyInfo info in typeof(T).GetProperties()
        .Where(x=>x.DeclaringType == typeof(T))) // filtering by declaring type
{
    propertyNames.Add(info.Name);
}

Ответ 2

Использование простого цикла для получения имен свойств базового класса

var type = typeof(T);

var nameOfBaseType = "Object";

while (type.BaseType.Name != nameOfBaseType)
{
    type = type.BaseType;
}

propertyNames.AddRange(type.GetProperties().Select(x => x.Name))

Ответ 3

... Я хочу только те свойства, которые находятся в дочернем классе. Возможно ли это?

Вам нужно использовать перегрузку GetProperties, которая принимает BindingFlags и включить флаг BindingFlags.DeclaredOnly.

PropertyInfo[] infos = typeof(ChildClass).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

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