C# 跟踪已更改(未保存)的对象

C# 跟踪已更改(未保存)的对象,c#,properties,C#,Properties,我有一个类,当用户决定打开或保存XML文件时,该类被序列化到XML文件中或从XML文件中序列化。我试图添加一个典型的功能,当他们试图关闭带有未保存更改的表单时,表单会向他们发出警告,并在关闭前为他们提供保存选项 我已经在我的类中添加了一个hasunavedchanges属性,我的表单在关闭前检查该属性。然而,我的财产已经从这样的东西改变了,这有点令人恼火 public string Name { get; set; } 对此 private string _Name; publi

我有一个类,当用户决定打开或保存XML文件时,该类被序列化到XML文件中或从XML文件中序列化。我试图添加一个典型的功能,当他们试图关闭带有未保存更改的表单时,表单会向他们发出警告,并在关闭前为他们提供保存选项

我已经在我的类中添加了一个
hasunavedchanges
属性,我的表单在关闭前检查该属性。然而,我的财产已经从这样的东西改变了,这有点令人恼火

public string Name
{
    get;
   set;
}
对此

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

有没有更好的方法来跟踪类实例的更改?例如,是否有某种标准方法可以将类的实例“散列”为一个值,用于将最新版本与保存的版本进行比较,而不会弄乱类中的每个属性?

您可以将属性部分减少为单行:

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);
}
private bool\u修改;
受保护的无效集合属性(
参考价值成员,
TValue newValue,
IEqualityComparer(质量比较者与平等比较者)
{
var changed=!equalityComparer.Equals(成员,newValue);
如果(更改)
{
成员=新值;
_修改=真;
}
}
受保护的void SetProperty(ref TValue成员,TValue newValue)
{
SetProperty(ref成员、newValue、EqualityComparer.Default);
}

请删除第二个SetProperty重载的返回。@jcalico:捕捉得好。我为这个答案修改的代码返回属性是否被修改,但是因为我们将它存储在这个问题的成员变量中,所以我使用了
void
。我删除了
返回
。我想知道使用{get;set;}模式时是否有解决方案。