Tag: 深拷贝

对象深度克隆实现

我必须实现generics扩展deepclone方法,该方法可以与任何引用类型实例一起使用以获取其深层副本。 我实现如下 static class ClassCopy { static public T DeepClone (this T instance) { if (instance == null) return null; var type = instance.GetType(); T copy; var flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; var fields = type.GetFields(flags); // If type is serializable – create instance copy using BinaryFormatter if (type.IsSerializable) { using […]

如何创建列表集的深层副本

假设我有以下课程: public class Author { public int ID {get; private set;} public string firstName {get; private set;} public string lastName {get; private set; } public Author(int id, string firstname, string lastname) { this.ID = ID; this.firstName = firstname; this.lastName = lastName; } public static Author Clone(Author clone) { Author copyAuth = new Author(clone.ID, clone.firstName, clone.lastName); […]

在C#中克隆对象

我用虚拟属性定义了下一个类: public class Order: BaseEPharmObject { public Order() { } public virtual Guid Id { get; set; } public virtual DateTime Created { get; set; } public virtual DateTime? Closed { get; set; } public virtual OrderResult OrderResult { get; set; } public virtual decimal Balance { get; set; } public virtual Customer Customer { […]

为什么.NET框架不提供深度复制对象的方法?

我前几天使用自定义方法深度克隆对象,我知道你可以用不同的方式深度克隆(reflection,二进制序列化等),所以我只是想知道: 微软在框架中不包含深层复制方法的原因是什么?

如何深度复制类而不将其标记为Serializable

鉴于以下课程: class A { public List ListB; // etc… } 其中B是另一个可以inheritance/包含其他类的类。 鉴于这种情况: A是一个大类,包含许多引用类型 我不能将B标记为[Serializable]因为我无法访问B源代码 以下执行深度复制的方法不起作用: 我不能使用ICloneable或MemberwiseClone因为A类包含许多引用类型 我无法为A编写复制构造函数,因为该类很大且不断被添加到,并且包含无法深度复制的类(如B ) 我无法使用序列化,因为我无法将包含的类(如B ,没有可用的源代码)标记为[Serializable] 我怎样才能深造A级?

为什么List的副本仍使用C#更改原始List中的属性

可以说我有这门课 public class Employee { public string FirstName { get; set; } public string LastName { get; set; } public bool isActive { get; set; } } 并像这样使用它: List Employees = new List(); Employees.Add(new Employee { FirstName = “firstname”, LastName = “lastname”, isActive = true }); List EmployeesCopy = new List(Employees); EmployeesCopy[0].isActive = false; 为什么更改EmployeesCopy […]

从C#中的位图创建一个全新的位图副本

我需要从另一个位图获得位图的深层副本。 现在,大多数解决方案都是这样的 ,这不是一个深层次的副本 。 这意味着当我锁定原始位图时,副本也会被锁定,因为克隆是原始位图的浅表副本 。 现在以下似乎对我有用,但我不确定它是否适用于所有情况。 public static Bitmap GetCopyOf(Bitmap originalImage) { Rectangle rect = new Rectangle(0, 0, originalImage.Width, originalImage.Height); Bitmap retrunImage = new Bitmap(originalImage.Width, originalImage.Height, originalImage.PixelFormat); BitmapData srcData = originalImage.LockBits(rect, ImageLockMode.ReadOnly, originalImage.PixelFormat); BitmapData destData = retrunImage.LockBits(rect, ImageLockMode.WriteOnly, originalImage.PixelFormat); int dataLength = Math.Abs(srcData.Stride) * srcData.Height; byte[] data = new byte[dataLength]; Marshal.Copy(srcData.Scan0, data, 0, data.Length); […]

如何创建Bitmap深层副本

我在我的应用程序中处理Bitmaps,出于某些目的,我需要创建Bitmap的深层副本。 有一种优雅的方式怎么做? 我试过了 Bitmap deepCopy = original.Clone(); ,显然这不是创造一个深刻的副本,而是浅薄的副本。 我的下一个尝试是创建一个新的位图 Bitmap deepCopy = new Bitmap(original); 不幸的是,这个构造函数是Bitmap(Image),而不是Bitmap(Bitmap),而Bitmap(Image)会将我漂亮的8bppIndexed Pixelformat转换为另一个。 另一种尝试是使用MemoryStream public static Bitmap CreateBitmapDeepCopy(Bitmap source) { Bitmap result; using (MemoryStream stream = new MemoryStream()) { source.Save(stream, ImageFormat.Bmp); stream.Seek(0, SeekOrigin.Begin); result = new Bitmap(stream); } return result; } 好吧,这也不起作用,因为必须在Bitmap的整个生命周期内打开MemoryStream。 所以,我总结了所有的后果,我真的很想看到一个很好的方法来创建一个Bitmap深层副本。 感谢那 :)

C#对象的深层副本

我正在研究一些用C#编写的代码。 在这个应用程序中,我有一个自定义集合定义如下: public class ResultList : IEnumerable { public List Results { get; set; } public decimal CenterLatitude { get; set; } public decimal CenterLongitude { get; set; } } Results使用的类型是三种自定义类型之一。 每个自定义类型的属性只是基本类型(整数,字符串,bools,int?,bool?)。 以下是其中一种自定义类型的示例: public class ResultItem { public int ID { get; set; } public string Name { get; set; } public bool? isLegit { […]

在Silverlight的扩展方法中使用reflection进行深层复制?

所以我试图找到一个通用的扩展方法,它使用reflection创建一个对象的深层副本,可以在Silverlight中使用。 使用序列化的深层复制在Silverlight中并不是那么好,因为它以部分信任方式运行并且BinaryFormatter不存在。 我也知道,reflection会比克隆序列化更快。 有一个方法可以复制公共,私有和受保护的字段,并且是递归的,这样它就可以复制对象中的对象,并且还可以处理集合,数组等。 我在线搜索,只能使用reflection找到浅拷贝实现。 我不明白为什么,因为你可以使用MemberwiseClone,所以对我来说,这些实现是没用的。 谢谢。