Отслеживание измененных (несохраненных) объектов - PullRequest
4 голосов
/ 06 апреля 2010

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

Я добавил свойство HasUnsavedChanges в свой класс, которое проверяется моей формой перед закрытием. Тем не менее, немного раздражает, что мои свойства изменились с чего-то вроде этого.

public string Name
{
    get;
   set;
}

к этому ...

private string _Name;
public string Name
{
    get
    {
         return _Name;
    }
   set
   {
        this._Name = value;
        this.HasUnsavedChanges = true;
   }
}

Есть ли лучший способ отследить изменения в экземпляре класса? Например, есть ли какой-нибудь стандартный способ, которым я могу «хэшировать» экземпляр класса в значение, которое я могу использовать для сравнения самой последней версии с сохраненной версией, не путая все свойства в классе?

1 Ответ

6 голосов
/ 06 апреля 2010

Вы можете уменьшить части имущества до одной строки:

private int _foo;

public int Foo
{
    get { return _foo; }
    set { SetProperty(ref _foo, value); }
}

Добавьте это к вашему базовому классу:

private bool _modified;

protected void SetProperty<TValue>(
    ref TValue member,
    TValue newValue,
    IEqualityComparer<TValue> equalityComparer)
{
    var changed = !equalityComparer.Equals(member, newValue);

    if(changed)
    {
        member = newValue;

        _modified = true;
    }
}

protected void SetProperty<TValue>(ref TValue member, TValue newValue)
{
    SetProperty(ref member, newValue, EqualityComparer<TValue>.Default);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...