C#中的深度克隆对象

本文关键字:对象 深度 | 更新日期: 2023-09-27 18:22:31

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

    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#中的深度克隆对象

我可以看到几个问题:

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

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

如果有一个成员对象无法共享(可能是文件句柄),该怎么办?

非公开会员呢?

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