你如何做一个.NET对象的深层副本(特别是C#)?

这个问题在这里已经有了答案:

  • 深入克隆对象39个答案

  • 我已经看到了一些不同的方法,但我使用了一种通用的实用方法:

    public static T DeepClone<T>(T obj)
    {
     using (var ms = new MemoryStream())
     {
       var formatter = new BinaryFormatter();
       formatter.Serialize(ms, obj);
       ms.Position = 0;
    
       return (T) formatter.Deserialize(ms);
     }
    }
    

    笔记:

  • 你的类必须被标记为[Serializable]才能工作。
  • 您的源文件必须包含以下代码:

    using System.Runtime.Serialization.Formatters.Binary;
    using System.IO;
    

  • 我写了一个基于递归“MemberwiseClone”的深层对象副本扩展方法。 它速度快(比BinaryFormatter 三倍),并且可以与任何对象一起使用。 您不需要默认的构造函数或可序列化的属性。


    基于Kilhoffer的解决方案...

    使用C#3.0,您可以创建一个扩展方法,如下所示:

    public static class ExtensionMethods
    {
        // Deep clone
        public static T DeepClone<T>(this T a)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream, a);
                stream.Position = 0;
                return (T) formatter.Deserialize(stream);
            }
        }
    }
    

    它使用DeepClone方法扩展了任何被标记为[Serializable]的类

    MyClass copy = obj.DeepClone();
    
    链接地址: http://www.djcxy.com/p/6961.html

    上一篇: How do you do a deep copy of an object in .NET (C# specifically)?

    下一篇: Is there a much better way to create deep and shallow clones in C#?