【问题标题】:Deep Clone objects in C# [closed]C# 中的深度克隆对象 [关闭]
【发布时间】:2012-02-26 14:32:34
【问题描述】:

我在 C# 中尝试了不同的深度对象克隆技术,最后找到了一个非常优雅的解决方案,它使用反射并且适用于不可序列化的类型。我只是想知道它是否有问题,以及是否有人有不适用于这种方法的 cmets 或用例。这是代码。感谢 cmets!

    public static T Clone<T>(this T source)
    {
        //  Get the type 
        Type type = source.GetType();
        T clone = (T)Activator.CreateInstance(type);
        //  Loop through the properties
        foreach (PropertyInfo pInfo in type.GetProperties())
        {
            pInfo.SetValue(clone, pInfo.GetValue(source, null), null);
        }
        //  Loop through the fields
        foreach (FieldInfo fInfo in type.GetFields())
        {
            fInfo.SetValue(clone, fInfo.GetValue(source).Clone());
        }
        return clone;
    }

标签: c# object clone


【解决方案1】:

我可以看到几个问题:

  1. 您只能复制公共属性和字段
  2. 您不克隆属性值,您只是复制它。这意味着它不是对属性的深度克隆。
  3. 有些类型不容易克隆(或根本不应该克隆),例如流或文件句柄(或任何非托管资源) - 您的方法可能会遇到问题。
  4. 您的方法不会处理循环引用。
  5. 并非所有类型都有无参数构造函数。

【讨论】:

  • 你说得对,我看到了缺陷,但它仍然有用。我正在编写一堆单元测试,它们使用类似的对象作为模拟参数。将这些对象创建为全局对象并使用克隆进行单独测试很方便。
【解决方案2】:

如果没有可访问的无参数构造函数怎么办?

如果存在无法共享的成员对象(可能是文件句柄)怎么办?

非公开会员呢?

为什么需要为一个不存在的问题创建一个万能的解决方案(您不需要能够深度克隆所有内容!)?

【讨论】:

  • 你的最后一个问题是有效的,但有一个明显的答案:我们很懒惰。如果我们需要一个快速的'n'dirty 深层副本,我们可以使用它。这很像旧的“撤消”技巧,您可以复制整个应用程序内存并在用户按下 CTRL+Z 时重新加载它。并非所有东西都必须遵循 MVC。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2012-06-05
  • 1970-01-01
  • 2013-09-06
  • 2013-10-11
  • 2018-03-21
相关资源
最近更新 更多