我需要多次克隆漂亮的大对象,我发现了更快的方法。
现在我使用BinaryForamter
序列化到MemoryStream
。所以这就是我想要使用的功能我正在谈论的(DeserializeToList
是我正在寻找的方法):
var originalObject = new MyClass();
var objectClones = new List<MyClass>();
var cloneCount = 10;
var formatter = new BinaryFormatter();
using (var stream = new MemoryStream())
{
formatter.Serialize(stream, originalObject);
stream.Seek(0, SeekOrigin.Begin);
objectClones = (MyClass)formatter.DeserializeToList(formatter, cloneCount);
}
有人有什么想法吗?
更新
我不想改变MyClass
。这就是我使用二进制序列化的原因。所以MyClass.Clone
暂时不是解决方案。
更新2:
我不想触摸MyClass
或他们的财产。因此,手动复制属性不是我正在寻找的方式。
答案 0 :(得分:1)
如果您不想触及原始课程,可以使用扩展方法。
public class MyClass
{
public string Name { get; set; }
}
public static class MyClassExtensions
{
public static MyClass Clone(this MyClass obj)
{
return new MyClass()
{
Name = obj.Name
};
}
}
然后使用它:
var originalObj = new MyClass() { Name = "Original" };
var clonedObj = originalObj.Clone();
Console.WriteLine(clonedObj.Name); // Name = "Original"
答案 1 :(得分:0)
我没有测试基准测试的性能,但为什么不实现Clone接口?
public interface ICloneable<T>
{
T Clone();
}
public class ComplessObj : ICloneable<Book>
{
public string f1;
public int f2;
.. and so on
public ComplessObj Clone()
{
return new ComplessObj { /* set properties f1,f2 ..*/ };
}
}
每次你想要复杂对象的深层克隆列表
您可以使用LINQ
List<ComplessObj> ComplessObj_2 = ComplessObj.Select(co => co.Clone()).ToList();
或
List<ComplessObj> ComplessObj_2 = ComplessObj.ConvertAll(co => co.Clone());