Как игнорировать все скрытые свойства класса, наследуемые с помощью отражения? - PullRequest
1 голос
/ 05 апреля 2019

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

public class Class1
{
    public string A { get; set; }
    public bool B  { get; set; }
}

public class Class2 : Class1 
{
    public new bool? B { get; set; }
    public bool C { get; set; }
}

Мне нужно получить все свойства Class2, однако при использовании Class2.GetType (). GetProperties () результат содержит B из Class2 И Class1. Это вызывает мою проблему, так как при циклическом прохождении каждого свойства я отправляю B дважды, одно со значением по умолчанию, равным false, поскольку оно никогда не устанавливалось, затем другое с правильным значением, которое было установлено моей службой. Мне нужно, чтобы результат содержал B из Class2, A из Class1 и C из Class2, но игнорирую B из Class1, так как он был скрыт с новым ключевым словом.

Я попытался просмотреть флаги привязки, которые могу использовать, но это не помогло. Ближайший флаг, который я могу найти, это флаг BindingFlags.DeclaredOnly, но он исключает A из Class1, поэтому он не будет работать для меня.

Как бы я проигнорировал исходное свойство, если оно было скрыто?

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Если я правильно вас понимаю, вам нужны все свойства из Class2 и все свойства из Class1, которые не были переопределены в Class2

Вы можете сделать это с помощью двух вызовов GetProperties: сначала выберите все, определенные в Class2, затем посетите тип Class1 и добавьте все, что отсутствует

var type = typeof(Class2);
var list = new List<PropertyInfo>();
list.AddRange(type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly));

var baseType = type.BaseType;
if (baseType != null)
{
    foreach (var propertyInfo in baseType.GetProperties())
    {
        if (list.All(p => p.Name != propertyInfo.Name))
            list.Add(propertyInfo);
    }
}

Если вы распечатаете этот список

foreach (var propertyInfo in list)
    Console.WriteLine($"From {propertyInfo.DeclaringType} > '{propertyInfo.Name}':{propertyInfo.PropertyType}");

Вы увидите что-то вроде:

из класса 2> 'B': System.Nullable`1 [System.Boolean]
От Class1> 'A': System.String

1 голос
/ 05 апреля 2019

Вы можете использовать запрос LINQ для фильтрации скрытых свойств.

var allProps = typeof(Class2).GetProperties(
        BindingFlags.Instance | BindingFlags.Public
);

var thePropsYouWant = 
        from p in allProps
        group p by p.Name into g
        select g.OrderByDescending(t => t.DeclaringType == typeof(Class2)).First();

Смотрите это здесь: https://dotnetfiddle.net/V5sGIs

...