3

我需要执行功能,如果用户要关闭窗口(或执行一些其他操作)而不保存他们的更改,他们将收到一个消息框通知。

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

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

将对象复制到 中的最佳方法是什么_original,而不是它们都只是引用内存中的同一位置?

另外,之后比较两个对象的最佳方法是什么,看看对象是否不同_original

4

5 回答 5

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);
    }
}
于 2012-07-25T14:53:12.830 回答
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; }
}

这将需要一些额外的工作,例如确定何时初始化对象(除非您仅将其限制为构造函数),但是,您明白了。

于 2012-07-25T14:55:29.633 回答
1

实现ICloneable它是一种简单的方法来进行浅拷贝(假设您的对象不是太复杂)然后您可以使用IComparableIEquatable,具体取决于您要如何检查它们是否不同或只是它们不同。

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

于 2012-07-25T14:55:42.363 回答
0

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

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

于 2012-07-25T14:55:37.433 回答
0

这可能有点矫枉过正,但我​​会实现icloneableicomparable。至于创建副本,如果对象是简单的memberwiseclone始终是一个选项。如果对象是嵌套的 udt,您将不得不将 idom 继续简化为简单类型,但我发现单元测试无论如何都会有所帮助。

于 2012-07-25T14:57:35.777 回答