最高效率的对象深拷贝通用方法

qldsrx 2012-12-06 07:24:18
加精
曾有人发帖要高效的对象拷贝通用方法,当时只给了一个简单类型的拷贝,现在挤出点时间完成了这个功能,内部的引用类型依次深度拷贝。

完整代码见博客:http://blog.csdn.net/qldsrx/article/details/8265985

这里发帖收集建议意见,简单的测试了下,已经非常完美的运行了,目前能支持任何带无参数的构造函数的类的深拷贝,一元数组的深拷贝,数组和类的循环嵌套深拷贝(即父子关系的类,或双向链表)。

感兴趣的朋友,可以研究下Emit部分,这是C#的精华,也是能够提高效率的必备利器,嫌.NET慢的人不要光抱怨,那是因为你们不懂优化代码,会了Emit就可以最高限度的优化代码。


/// <summary>
/// 创建对象深度复制的副本
/// </summary>
public static T ToObjectCopy<T>(this T source) where T : class

/// <summary>
/// 将source对象的所有属性复制到target对象中,深度复制
/// </summary>
public static void ObjectCopyTo<T>(this T source, T target) where T : class

这2个方法原型是给外部调用的,使用起来很方便,也足够了。下面说下一个很常见的使用场合,那就是实体类的复制并修改,当我们要编辑集合中的某个实体对象的内容时,又怕改错了,想提供回滚功能,就可以用它将其复制一个副本出来。

虽然已经改过不少次了,但难免有BUG,欢迎提出宝贵意见。代码中的注释不多,没那么多时间完善,想学习的人可以对照MSDN慢慢看,这东西要消化很费脑细胞,慢慢琢磨吧。
...全文
15625 192 打赏 收藏 转发到动态 举报
写回复
用AI写文章
192 条回复
切换为时间正序
请发表友善的回复…
发表回复
暗尘掩月 2015-03-09
  • 打赏
  • 举报
回复
mark
S314324153 2015-03-09
  • 打赏
  • 举报
回复
挺老的坑了
RicahrdTang 2015-03-09
  • 打赏
  • 举报
回复
@qldsrx @楼主 ,我使用您的方法,对象包含三级及三级以上的子属性嵌套时,在Copy对象出报如下错误: System.Security.VerificationException:{"操作可能会破坏运行时稳定性。"},,楼主您之前有没有遇到过类似的问题,求指教 ,谢谢 在 Cloned6c781f2-b3ed-4167-a263-2c94cbff4182(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.CopyImpl[T](T source, Dictionary`2 objects) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 308 在 Clonedf9740c3-a0c7-4f8f-b187-a15070bba111(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.CopyImpl[T](T source, Dictionary`2 objects) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 308 在 Clone3f109666-cde1-421a-85fa- 在 Cloned6c781f2-b3ed-4167-a263-2c94cbff4182(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.CopyImpl[T](T source, Dictionary`2 objects) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 308 在 Clonedf9740c3-a0c7-4f8f-b187-a15070bba111(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.CopyImpl[T](T source, Dictionary`2 objects) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 308 在 Clone3f109666-cde1-421a-85fa-8df42a474ebb(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.CopyImpl[T](T source, Dictionary`2 objects) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 308 在 Clone9b0ef9cf-dd5d-46cc-ac4d-fa140157720c(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.ToObjectCopy[T](T source) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 329 在 ConsoleObjectCopy.Program.Main(String[] args) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ConsoleObjectCopy\Program.cs:行号 28 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart()8df42a474ebb(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.CopyImpl[T](T source, Dictionary`2 objects) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 308 在 Clone9b0ef9cf-dd5d-46cc-ac4d-fa140157720c(Object , Dictionary`2 ) 在 ObjectCopy.ObjectCopy.ToObjectCopy[T](T source) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ObjectCopy\ObjectCopy.cs:行号 329 在 ConsoleObjectCopy.Program.Main(String[] args) 位置 F:\Person_Workspace\Ado.net\Mvc_Test\ConsoleObjectCopy\Program.cs:行号 28 在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart()
wuyangzu01 2015-01-28
  • 打赏
  • 举报
回复
顶起
effun 2014-11-28
  • 打赏
  • 举报
回复
引用 187 楼 qldsrx 的回复:
我的博客被CSDN给禁了,不晓得是啥原因,也没收到类似的通知,真不知道CSDN是怎么回事,帖子也是发了不能编辑的,本来想用博客链接来代替编辑,没办法,见谅!
会不会是因为在博客园开博的原因啊?
youzelin 2014-11-27
  • 打赏
  • 举报
回复
你的 BLOG 没法看,网页打不开
qldsrx 2014-11-27
  • 打赏
  • 举报
回复
引用 180 楼 lyj224170707 的回复:
我靠。。博客打不开。。求例子啊

我的博客被CSDN给禁了,不晓得是啥原因,也没收到类似的通知,真不知道CSDN是怎么回事,帖子也是发了不能编辑的,本来想用博客链接来代替编辑,没办法,见谅!
effun 2014-11-27
  • 打赏
  • 举报
回复
晕倒,仔细一看居然是2年前的帖子,这也能挖得出来,而且居然这么久都没有结帖。
effun 2014-11-27
  • 打赏
  • 举报
回复
打不开啊:该博客违反了网站规则被关闭
qq_19920727 2014-11-27
  • 打赏
  • 举报
回复
伸手 接分 接分 接分 给我分 给我分 顶啊顶 给我分
我现在在路上 2014-11-27
  • 打赏
  • 举报
回复
我靠 谁挖的坟,而且坟里居然没东西东西怎么挂了?
游离失所 2014-11-26
  • 打赏
  • 举报
回复
我靠。。博客打不开。。求例子啊
於黾 2014-07-22
  • 打赏
  • 举报
回复
顶一下
whatdoyousay 2014-07-21
  • 打赏
  • 举报
回复
完全看不懂
wwwww112233 2014-07-20
  • 打赏
  • 举报
回复
这代码写得挺神。
程序员一灯 2013-03-15
  • 打赏
  • 举报
回复
Frog1228 2013-03-15
  • 打赏
  • 举报
回复
引用 170 楼 qldsrx 的回复:
引用 169 楼 mjjackey 的回复:这个主要用在什么地方? 学习用,既能理解对象复制及序列化的本质,又能学习Emit的使用。对C#性能优化有兴趣的可以看看, 只求界面出来,不考虑效率的绕道。如果我只是提供你们使用,没必要直接给源码的。
请问Emit是什么?我没碰到过。
chdphhdhzhhdhz 2013-03-15
  • 打赏
  • 举报
回复
觉得可以用反射来实现,例如2.0的就支持不了这种代码吧。。
qldsrx 2013-03-15
  • 打赏
  • 举报
回复
引用 169 楼 mjjackey 的回复:
这个主要用在什么地方?
学习用,既能理解对象复制及序列化的本质,又能学习Emit的使用。对C#性能优化有兴趣的可以看看, 只求界面出来,不考虑效率的绕道。如果我只是提供你们使用,没必要直接给源码的。
Frog1228 2013-03-15
  • 打赏
  • 举报
回复
这个主要用在什么地方?
加载更多回复(143)

110,578

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧