c# - 如何复制一个对象,然后将其与原始对象进行比较,看是否发生了变化?

标签 c# c#-4.0

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

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

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

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

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

最佳答案

您可以使用 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);
    }
}

关于c# - 如何复制一个对象,然后将其与原始对象进行比较,看是否发生了变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11652477/

相关文章:

linq - 将 Linq 和 .ToList()、.Single() 等作为 func 参数传递给另一个方法是否安全?

c# - Action<T1, T2> 和传递多个参数时出现问题

c# - 有关 C# 4.0 中的代码契约的书籍

c# - Kendo UI 将 DropDownList 添加到 Grid (MVC)

c# - ASP.NET Identity Token Methods 接受所有 HTTP 方法

c# - 首先检查数据库单元格是否为空

c# - 并行编程——我需要一些说明

c# - 什么是 GetFullPath(String, String) 重载?

c# - ASP.NET:通过UserControl调用MasterPage中的函数

asp.net-mvc - 当 string[] 中不存在列名时,创建列名 List<string> 的最佳方法是什么?