对象复制(所谓的克隆-Clone)
2005-08-30 16:31 灵感之源 阅读(5126) 评论(10) 编辑 收藏 举报
对象复制,最generic的方法,估计是继承ICloneable,然后写Clone函数。
但当该函数不能修改,如是第三方组件中的类,或者因为其它原因,我们就被迫采取别的方法了。
如果碰巧对象实现了ISerializable,那么我们可以:

private static void TestClone()
{
Person p1 = new Person();
p1.Age = 26;
p1.UserName = "灵感之源";

Person p2 = (Person)CloneObjectEx(p1);
p2.UserName = "unruledboy";

Console.WriteLine(p1.UserName);
Console.WriteLine(p2.UserName);
}

public static Person CloneObject(Person ObjectInstance)
{
BinaryFormatter bFormatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bFormatter.Serialize(stream, ObjectInstance);
stream.Seek(0, SeekOrigin.Begin);
Person newObject = (Person)bFormatter.Deserialize(stream);
return newObject;
}

public static object CloneObjectEx(object ObjectInstance)
{
BinaryFormatter bFormatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bFormatter.Serialize(stream, ObjectInstance);
stream.Seek(0, SeekOrigin.Begin);
return bFormatter.Deserialize(stream);
}
[Serializable]
public class Person
{
private int age;
private string userName;

public Person()
{
}

public int Age
{
get{return age;}
set{age = value;}
}
public string UserName
{
get{return userName;}
set{userName = value;}
}
}
CloneObject和CloneObjectEx的区别在于:CloneObject返回的是强类型,但限制为指定的类型,不通用;后者通用,但性能要更加低。
或者显式采用反射来逐个获取对象的每个属性:
Base class for cloning an object in C#
如果对象连ISerializable都没有实现,那么我们只能:
How to serialize an object which is NOT marked as 'Serializable' using a surrogate
如果上述的方法都不满意,请你研究得出结果之后告诉我;)
但当该函数不能修改,如是第三方组件中的类,或者因为其它原因,我们就被迫采取别的方法了。
如果碰巧对象实现了ISerializable,那么我们可以:





















































CloneObject和CloneObjectEx的区别在于:CloneObject返回的是强类型,但限制为指定的类型,不通用;后者通用,但性能要更加低。
或者显式采用反射来逐个获取对象的每个属性:
Base class for cloning an object in C#
如果对象连ISerializable都没有实现,那么我们只能:
How to serialize an object which is NOT marked as 'Serializable' using a surrogate
如果上述的方法都不满意,请你研究得出结果之后告诉我;)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架