如何复制对象,然后将其与原始对象进行比较以查看它是否已更改?

时间:2012-07-25 14:50:33

标签: c# c#-4.0

我需要执行功能,如果用户要关闭窗口(或执行其他操作)而不保存更改,则会通过消息框通知他们。

为了能够做到这一点,我需要知道自窗口打开以来是否对相关对象进行了更改。

我正在考虑一种方法是在窗口加载时创建对象的副本并将其保持为_original然后在窗口关闭之前我可以将它与可能或可能的对象进行比较没有改变。

将对象复制到_original的最佳方法是什么,而两者都没有引用内存中相同的位置?

此外,比较两个对象的最佳方法是,查看对象是否与_original不同?

5 个答案:

答案 0 :(得分:4)

您可以使用BinaryFormatter序列化对象,然后将其反序列化:

public static string Serialize<T>(T instance)
{
    var formatter = new BinaryFormatter();
    using (var stream = new MemoryStream())
    {
        formatter.Serialize(stream, instance);
        return Convert.ToBase64String(stream.ToArray());
    }
}

public static T Deserialize<T>(string serialized)
{
    var formatter = new BinaryFormatter();
    using (var stream = new MemoryStream(Convert.FromBase64String(serialized)))
    {
        return (T)formatter.Deserialize(stream);
    }
}

答案 1 :(得分:3)

您可以以维持modified状态的方式实现您的对象,例如

public class StatefulObject
{
    private string _propertyOne;

    public StatefulObject()
    {
        this.Modified = false;
    }

    public string PropertyOne
    {
        get { return this._propertyOne; }
        set
        {
            if (this._propertyOne != value)
            {
                this._propertyOne = value;
                this.Modified = true;
            }
        }
    }

    public bool Modified { get; private set; }
}

这需要一些额外的工作,比如确定刚刚初始化对象的时间(除非你只将它限制在构造函数中),但是,你得到了这个想法。

答案 2 :(得分:1)

实现ICloneable一个简单的方法来做一个浅拷贝(假设你的对象太复杂了) 然后,您可以使用IComparableIEquatable,具体取决于您希望检查它们的不同之处或只是它们不同。

如果你想要一个更好的答案,那么你需要更具体一点。

答案 3 :(得分:0)

我认为比较对象不是最好的解决方案。我建议观察窗户本身。如果在窗口逻辑中使用属性,则NotifyPropertyChanged将是最佳的。

http://www.dreamincode.net/forums/topic/208833-using-the-inotifypropertychanged-functionality/

答案 4 :(得分:0)

这可能有点矫枉过正,但我​​会实施icloneableicomparable。至于创建副本如果对象很简单memberwiseclone总是一个选项。如果对象是嵌套的udt,你将不得不将idom继续下去到简单类型,但我发现单元测试这对任何方式都有帮助。