2010-04-05 5 views
4

J'ai une classe qui est sérialisée vers et à partir d'un fichier XML lorsque l'utilisateur a décidé d'ouvrir ou de sauvegarder. J'essaye d'ajouter la fonctionnalité typique où quand ils essayent de fermer le formulaire avec des changements non-sauvés le formulaire les avertit et leur donne l'option d'enregistrer avant la fermeture.Suivi des objets modifiés (non enregistrés)

J'ai ajouté une propriété HasUnsavedChanges à ma classe, que ma fiche vérifie avant de la fermer. Cependant, il est un peu ennuyeux que mes propriétés ont changé de quelque chose comme ça ..

public string Name 
{ 
    get; 
    set; 
} 

à cette ...

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

Y at-il une meilleure façon de suivre les modifications apportées à une instance d'une classe ? Par exemple, y a-t-il une manière standard de "hacher" une instance d'une classe dans une valeur que je peux utiliser pour comparer la version la plus récente avec la version sauvegardée sans avoir à copier toutes les propriétés de la classe?

Répondre

6

Vous pouvez réduire les pièces de propriété aux lignes simples:

private int _foo; 

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

Ajouter à votre classe de base:

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); 
} 
+0

+1, thats un beau morceau de code. –

+0

Veuillez supprimer le retour sur la deuxième surcharge SetProperty. – JCallico

+0

@JCallico: Bonne prise. Le code que j'ai adapté pour cette réponse retourne si la propriété a été modifiée, mais comme nous la stockons dans une variable membre pour cette question, j'ai utilisé 'void' à la place. J'ai enlevé le 'retour'. –

Questions connexes