Вызвать метод базового класса у всех полей в модели с помощью рефлексии

174
05 августа 2018, 22:20

У меня есть модель DealModel в которой есть кастомные свойства по типу CustomInt, CustomDate, CustomDecimal и.т.д

В базовом классе от которого наследуются кастомные свойства есть метод bool IsModified()

Нужно написать метод в котором будут вытянуты все свойства модели и вызван метод базового класса. Если, какое то свойство вернет true - то вернуть true, если все свойства вернули false - тогда вернуть false

public bool IsAnyFieldChanged(DealModel entity)
{
    bool isModified = false;
    // получаю список всех полей в моделе
    var fields = entity.GetType().GetProperties();
    foreach (var field in fields)
    {
        // а как быть тут?
    }
    return isModified;
}  
Answer 1

Не все поля, а поля, тип которых унаследован от определённого класса.
Так что

 var fields = entity.GetType().GetProperties();

меняем на

var props = bar.GetType()
   .GetProperties(BindingFlags.Public | BindingFlags.Instance)
   .Where(x=> x.PropertyType.BaseType == typeof(BaseFoo));

Тут мы получим все публичные свойства экземпляра, значения которых имеют тип, унаследованный от базового (типы указываю по примеру из фиддла).

Дальше всё просто - получаем значение, свойство приводим к базовому, проверяем на IsModified:

foreach (var prop in props)
{
    if (((BaseFoo)prop.GetValue(bar)).IsModified())
        changed = true;
}

Фиддл: https://ideone.com/tEEZ3W

Если всё так, как я думаю, и у вас не наследование, а generic-типы, то получение свойств меняем на:

 var props = bar.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance)
                .Where(x => x.PropertyType.IsGenericType 
                           && x.PropertyType.GetGenericTypeDefinition()==typeof(Foo<>) );

Тут мы получим все публичные свойства экземпляра, реализующиее определённый generic-класс. А проверка на изменение, соответственно, будет выглядеть как:

foreach (var prop in props)
{
    if ((bool)(prop.PropertyType.GetMethod("IsModified")
                   .Invoke(prop.GetValue(bar), new object[] { })))
        changed = true;
}

Фиддл: https://ideone.com/Td2M4T

READ ALSO
Оставить только необходимые цвета с Bitmap

Оставить только необходимые цвета с Bitmap

Как в Bitmap оставить только необходимые цвета пикселей, а остальные превратить, например, в чёрный цвет?

154
Использование своего UserControl WPF

Использование своего UserControl WPF

Создал свой User Control элементРасставил и настроил там элементы как они должны располагаться, растягиваться

173
Как выгрузить DataGrid в XML?

Как выгрузить DataGrid в XML?

Имеется DataGridЕсть проблемы с выгрузкой содержимого в XML

164
Не отображается UserControl в конструкторе WinForms

Не отображается UserControl в конструкторе WinForms

Cуть проблемы в том что у меня есть три usercontrol-а для трех фигур, два из них отображаются, а один нет(обведен красным, в контроле должно быть видно...

144