C# DeepCopy自动将任意对象进行深度拷贝(也可以将ClassA自动转换为ClassB)
大家在Coding的时候,经常会遇到“传引用”类型导致误改数据的情况,“莫名其妙”的就把数据改错了。比如说:有一个classA,紧接着开启一个线程processA,在线程processA运行过程中,classA.Name="吾乐吧软件站" 被改为了 classA.Name="搜妹子"。这个时候,假设你需要获取classA.Name,请问,你获取的classA.Name是哪个值呢?当你获取的时候,processA是否运行完毕了呢?大家不得而知……
当然啦,这个举例只是冰山一角,解决问题的方法也有很多。现在,本文讲解,如何把任意对象进行深度拷贝(深度复制每个字段、属性),而不需要你每次手写代码拷贝/复制每个字段、属性的值。本文的方法,也可以自动将两个类进行转换~~前提是字段、属性名称一致~~遇到不需要转换的字段,添加[NonSerialized]标记即可。不说太多了,直接上代码!
深度拷贝:不仅仅要复制对象的基本类,同时也复制原对象中的对象,就是完全产生新的对象
ObjectHelper.cs 代码
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#region Header
// -------------------------------------------------------------------------------------------------------------------- // ┏┓ ┏┓ // ┏┛┻━━━┛┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃ ┳┛ ┗┳ ┃ // ┃ ┃ // ┃ ┻ ┃ // ┃ ┃ // ┗━┓ ┏━┛ // ┃ ┃ 神兽保佑 // ┃ ┃ 代码无BUG! // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛ // // Copyirght: Copyright (C) 2014 - CCINN All rights reserved // Solution: ConsoleApplication // Project: ConsoleApplication // File: ObjectHelper.cs // Author: flydoos // CreateDate: 2014-10-23 09:15 // ModifyDate: 2014-10-23 09:30 // -------------------------------------------------------------------------------------------------------------------- #endregion using System.IO; using System.Runtime.Serialization.Json; using System.Text; namespace ConsoleApplication { /// <summary> /// 对象帮助类 /// </summary> public class ObjectHelper { /// <summary> /// 将C#数据实体转化为JSON数据 /// </summary> /// <param name="obj">要转化的数据实体</param> /// <returns>JSON格式字符串</returns> public static string JsonSerialize<T>(T obj) { var serializer = new DataContractJsonSerializer(typeof (T)); var stream = new MemoryStream(); serializer.WriteObject(stream, obj); stream.Position = 0; var sr = new StreamReader(stream); string resultStr = sr.ReadToEnd(); sr.Close(); stream.Close(); return resultStr; } /// <summary> /// 将JSON数据转化为C#数据实体 /// </summary> /// <param name="json">符合JSON格式的字符串</param> /// <returns>T类型的对象</returns> public static T JsonDeserialize<T>(string json) { //json 必须为 {name:"value",name:"value"} 的格式(要符合JSON格式要求) var serializer = new DataContractJsonSerializer(typeof (T)); var ms = new MemoryStream(Encoding.UTF8.GetBytes(json.ToCharArray())); var obj = (T) serializer.ReadObject(ms); ms.Close(); return obj; } /// <summary> /// 不同对象之间的深拷贝,最好属性名一样 /// </summary> /// <typeparam name="T">源对象类型</typeparam> /// <typeparam name="TF">目的对象类型</typeparam> /// <param name="original">源对象</param> /// <returns>目的对象</returns> public static TF DeepCopy<T, TF>(T original) { string json = JsonSerialize(original); var result = JsonDeserialize<TF>(json); return result; } } } |
WebSiteA.cs 代码
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#region Header
// -------------------------------------------------------------------------------------------------------------------- // ┏┓ ┏┓ // ┏┛┻━━━┛┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃ ┳┛ ┗┳ ┃ // ┃ ┃ // ┃ ┻ ┃ // ┃ ┃ // ┗━┓ ┏━┛ // ┃ ┃ 神兽保佑 // ┃ ┃ 代码无BUG! // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛ // // Copyirght: Copyright (C) 2014 - CCINN All rights reserved // Solution: ConsoleApplication // Project: ConsoleApplication // File: WebSiteA.cs // Author: flydoos // CreateDate: 2014-10-23 09:18 // ModifyDate: 2014-10-23 09:30 // -------------------------------------------------------------------------------------------------------------------- #endregion using System; namespace ConsoleApplication { /// <summary> /// 网站A类 /// </summary> [Serializable] public class WebSiteA { /// <summary> /// 编号 /// </summary> public int Id { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 简介 /// </summary> public string Description { get; set; } /// <summary> /// 网址 /// </summary> public string Url { get; set; } } } |
WebSiteB.cs 代码
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#region Header
// -------------------------------------------------------------------------------------------------------------------- // ┏┓ ┏┓ // ┏┛┻━━━┛┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃ ┳┛ ┗┳ ┃ // ┃ ┃ // ┃ ┻ ┃ // ┃ ┃ // ┗━┓ ┏━┛ // ┃ ┃ 神兽保佑 // ┃ ┃ 代码无BUG! // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛ // // Copyirght: Copyright (C) 2014 - CCINN All rights reserved // Solution: ConsoleApplication // Project: ConsoleApplication // File: WebSiteB.cs // Author: flydoos // CreateDate: 2014-10-23 09:20 // ModifyDate: 2014-10-23 09:30 // -------------------------------------------------------------------------------------------------------------------- #endregion using System; namespace ConsoleApplication { /// <summary> /// 网站B类 /// </summary> [Serializable] public class WebSiteB { /// <summary> /// 编号 /// </summary> public int Id { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 简介 /// </summary> public string Description { get; set; } /// <summary> /// 网址 /// </summary> public string Url { get; set; } #region 多了一个不需要序列化的字段 /// <summary> /// 邮箱 /// </summary> [NonSerialized] public string Email; #endregion 多了一个不需要序列化的字段 } } |
Program.cs 代码
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
#region Header
// -------------------------------------------------------------------------------------------------------------------- // ┏┓ ┏┓ // ┏┛┻━━━┛┻┓ // ┃ ┃ // ┃ ━ ┃ // ┃ ┳┛ ┗┳ ┃ // ┃ ┃ // ┃ ┻ ┃ // ┃ ┃ // ┗━┓ ┏━┛ // ┃ ┃ 神兽保佑 // ┃ ┃ 代码无BUG! // ┃ ┗━━━┓ // ┃ ┣┓ // ┃ ┏┛ // ┗┓┓┏━┳┓┏┛ // ┃┫┫ ┃┫┫ // ┗┻┛ ┗┻┛ // // Copyirght: Copyright (C) 2014 - CCINN All rights reserved // Solution: ConsoleApplication // Project: ConsoleApplication // File: Program.cs // Author: flydoos // CreateDate: 2014-09-22 15:38 // ModifyDate: 2014-10-23 09:30 // -------------------------------------------------------------------------------------------------------------------- #endregion using System; namespace ConsoleApplication { internal class Program { /// <summary> /// 入口函数 /// </summary> private static void Main() { var original = new WebSiteA { Id = 1001, Name = "吾乐吧软件站", Description = "一个高品质的绿色软件博客!", Url = "https://www.wuleba.com" }; //把WebSiteA自动转化为WebSiteB WebSiteB result = ObjectHelper.DeepCopy<WebSiteA, WebSiteB>(original); Console.WriteLine(result.Id); Console.WriteLine(result.Name); Console.WriteLine(result.Description); Console.WriteLine(result.Url); Console.WriteLine(result.Email); Console.ReadLine(); } } } |
下载方法:打开链接--输入验证码--进入下载列表--普通不限速下载。
下载地址:推荐地址 | 备用地址 |
下载说明:① 请不要相信网站的任何广告;② 当你使用手机访问网盘时,网盘会诱导你下载他们的APP,大家不要去下载,直接把浏览器改成“电脑模式/PC模式”访问,然后免费普通下载即可;③ 123云盘限制,必须登录后才能下载,且限制每人每天下载流量1GB,下载 123云盘免流量破解工具
版权声明:
小编:吾乐吧软件站
链接:https://wuleba.com/8238.html
来源:吾乐吧软件站
本站资源仅供个人学习交流,请于下载后 24 小时内删除,不允许用于商业用途,否则法律问题自行承担。


共有 0 条评论