关于C#的深拷贝的实现方式:

①反射

②反序列化

③表达式树

目前只讲解利用反射实现C#深拷贝的方法:

深拷贝工具类:

using System;using System.Collections.Generic;using System.Linq;using System.Reflection;using System.Text;namespace CopyDemo{    public sealed class CopyTools    {        public static T DeepCopy
(T obj)        {            //如果是字符串或值类型则直接返回            if (obj is string || obj.GetType().IsValueType) return obj;            object retval = Activator.CreateInstance(obj.GetType());            FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);            foreach (FieldInfo field in fields)            {                try { field.SetValue(retval, DeepCopy(field.GetValue(obj))); }                catch { }            }            return (T)retval;        }    }}

下面2个类用于测试:

宠物类->

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CopyDemo{    public sealed class Pet    {        public string Name { get; set; }    }}

人物类->

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CopyDemo{    public sealed class People    {        public string Name { set; get; }        public Pet My_Pet { get; set; }    }}

测试代码:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace CopyDemo{    public class Program    {        static void Main(string[] args)        {            People A = new People() {My_Pet = new Pet()};            A.Name = "Aonaufly";            A.My_Pet.Name = "小白";            Console.WriteLine("=================================================");            People _copyA = CopyTools.DeepCopy
(A);            _copyA.Name = "Kayer";            _copyA.My_Pet.Name = "旺财";            Console.WriteLine("源 name : {0} , petName : {1}" , A.Name,A.My_Pet.Name);            Console.WriteLine("Copy name : {0} , petName : {1}", _copyA.Name, _copyA.My_Pet.Name);            Console.ReadKey();        }    }}

运行结果: