2012-04-23 3 views
2

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

Мне нужно знать, какие свойства изменились со времени последнего обновления, поэтому я могу регистрировать изменения. Я мог бы сделать это, сохранив копию POCO из предыдущего обновления и выполнив сравнение каждый раз, а затем, возможно, включив событие для каждого изменения свойства.

У кого-нибудь есть лучшее решение, которое я мог бы использовать здесь?

+0

Что вы используете для обновления объекта (ADO, EF, NHibernate)? –

+1

Можете ли вы не просто записывать полную информацию о POCO при каждом изменении? – Oded

+0

@Oded - Да, я мог бы, но я собираюсь записывать много данных, и дубликаты будут способствовать значительному увеличению пространства для хранения, которое можно избежать. – Mattl

ответ

2
  • http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx это стандартный способ, который играет хорошо с DataBinding.

  • Сохранение состояния каждого свойства как «старого» значения при каждом обновлении необходимо в ситуации, когда вы хотите обнаруживать свойства, которые имеют фактически разные значения, чем в прошлый раз - например, если вы 't требуется свойство, которое изменилось с 5 на 3 до 7 назад до 5 с момента последнего обновления.

  • Если вы не заботитесь об этом различии и не хотите использовать свойствоchanged, вы можете дать каждому свойству значение bool, которое они установили для true в setter, и установить их в false при каждом обновлении ,

  • вы можете создать механика GetProperty/SetProperty - вы вызываете эти функции в сеттерах/геттерах, и затем вы можете сохранить фактические данные и любые метаданные об этом любым способом, находящимся под капотом. Однако это уже не POCO.

0

Насколько я знаю, нет ничего «встроенного» для .NET для отслеживания изменений свойств в классе. Однако любое из следующих действий должно работать:

1) Напишите код вручную в настройщике каждого свойства для отслеживания изменения.

2) Напишите код, который сравнивает «старую» копию с «обновленным» экземпляром (то же самое, что вы сказали в своем исходном сообщении).

3) Используйте структуру AOP (например, PostSharp), чтобы добавить какое-либо уведомление об обновлении для каждого свойства.

2

Если это действительно POCO, то нет, вам нужно будет сохранить копию. Если вы хотите добавить флаг IsDirty в свой POCO, вы можете установить его, когда свойство будет изменено. Вы могли бы сделать флаг IsDirty битовое поле, так что вы знаете, какие свойства были изменены:

class POCO 
{ 
[Flags] 
enum POCOFieldsEnum 
{ 
    Property1 = 0x01; 
    Property2 = 0x02; 
} 

private String _Property1; 
public String Property1 
{ 
    get { return _Property1; } 
    set 
    { 
    if (value.Equals(_Property1)) return; 
    _Property1 = value; 
    DirtyFlags |= POCOFieldsEnum.Property1; 
    } 
} 

private String _Property2; 
public String Property2 
{ 
    get { return _Property2; } 
    set 
    { 
    if (value.Equals(_Property2)) return; 
    _Property2 = value; 
    DirtyFlags |= POCOFieldsEnum.Property2; 
    } 
} 

POCOFieldsEnum DirtyFlags { private set; public get; } 
} 

Обратите внимание, что, если такой объект имеет свойство изменилось, а затем изменен обратно к исходному значению, то DirtyFlag все равно будет установлен. Если вы хотите предотвратить эту ситуацию, вам придется сохранить исходное значение свойств (или хэш из них), с которыми можно сравнивать в настройках свойств.

0

Создайте хэш различных свойств и сохраните его как свойство, а затем сравните его снова, проверяя.

Смежные вопросы