C# DeepCopy自动将任意对象进行深度拷贝(也可以将ClassA自动转换为ClassB)

作者: 时间: 2014-10-29 分类: 技术文章, 新闻资讯 | 0条评论 |

您的支持,是我前进的动力

大家在Coding的时候,经常会遇到“传引用”类型导致误改数据的情况,“莫名其妙”的就把数据改错了。比如说:有一个classA,紧接着开启一个线程processA,在线程processA运行过程中,classA.Name=”吾乐吧软件站” 被改为了 classA.Name=”搜妹子”。这个时候,假设你需要获取classA.Name,请问,你获取的classA.Name是哪个值呢?当你获取的时候,processA是否运行完毕了呢?大家不得而知……

当然啦,这个举例只是冰山一角,解决问题的方法也有很多。现在,本文讲解,如何把任意对象进行深度拷贝(深度复制每个字段、属性),而不需要你每次手写代码拷贝/复制每个字段、属性的值。本文的方法,也可以自动将两个类进行转换~~前提是字段、属性名称一致~~遇到不需要转换的字段,添加[NonSerialized]标记即可。不说太多了,直接上代码!

深度拷贝:不仅仅要复制对象的基本类,同时也复制原对象中的对象,就是完全产生新的对象

ObjectHelper.cs 代码

 C# Code By WuleBa.COM
1
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 代码

 C# Code By WuleBa.COM
1
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 代码

 C# Code By WuleBa.COM
1
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 代码

 C# Code By WuleBa.COM
1
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 = 
“http://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();

        }

    }

}


下载方法:打开链接–输入验证码–进入下载列表–普通不限速下载。

下载地址:推荐地址 | 备用地址 | 
搜妹子,搜出妹子做壁纸!

本文采用 CC协议 发布,转载请注明:转载自 吾乐吧软件站

本文链接地址:http://www.wuleba.com/?p=26285

发表评论


微软MSDN资源免费订阅,MSDN 我告诉你