在C#.NET中,深层复制不同类型的对象可以通过以下几种方法实现:
将对象序列化为字节流,然后再将字节流反序列化为一个新的对象。这样可以实现对象的深层复制。
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
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);
}
}
MemberwiseClone方法可以创建一个新的对象实例,并将当前对象的值逐个复制到新的实例中。但是,这种方法只能进行浅层复制,对于对象内部的引用类型,只会复制其引用。
public class MyClass
{
public int MyProperty { get; set; }
public object Clone()
{
return this.MemberwiseClone();
}
}
实现ICloneable接口,并在其中实现Clone方法,以实现深层复制。
public class MyClass : ICloneable
{
public int MyProperty { get; set; }
public object Clone()
{
return new MyClass
{
MyProperty = this.MyProperty
};
}
}
通过Expression树,可以动态地生成对象的深层复制代码。
using System.Linq.Expressions;
public static T DeepClone<T>(T obj)
{
var parameter = Expression.Parameter(typeof(T));
var expression = Expression.Lambda<Func<T, T>>(Expression.New(typeof(T).GetConstructor(Type.EmptyTypes)), parameter);
var func = expression.Compile();
return func(obj);
}
在实际应用中,可以根据具体需求选择合适的方法进行深层复制。
领取专属 10元无门槛券
手把手带您无忧上云