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

①反射

②反序列化

③表达式树

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

深拷贝工具类:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Reflection;usingSystem.Text;namespaceCopyDemo{publicsealedclassCopyTools{publicstaticTDeepCopy<T>(Tobj){//如果是字符串或值类型则直接返回if(objisstring||obj.GetType().IsValueType)returnobj;objectretval=Activator.CreateInstance(obj.GetType());FieldInfo[]fields=obj.GetType().GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.Static);foreach(FieldInfofieldinfields){try{field.SetValue(retval,DeepCopy(field.GetValue(obj)));}catch{}}return(T)retval;}}}

下面2个类用于测试:

宠物类->

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{publicsealedclassPet{publicstringName{get;set;}}}

人物类->

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{publicsealedclassPeople{publicstringName{set;get;}publicPetMy_Pet{get;set;}}}

测试代码:

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceCopyDemo{publicclassProgram{staticvoidMain(string[]args){PeopleA=newPeople(){My_Pet=newPet()};A.Name="Aonaufly";A.My_Pet.Name="小白";Console.WriteLine("=================================================");People_copyA=CopyTools.DeepCopy<People>(A);_copyA.Name="Kayer";_copyA.My_Pet.Name="旺财";Console.WriteLine("源name:{0},petName:{1}",A.Name,A.My_Pet.Name);Console.WriteLine("Copyname:{0},petName:{1}",_copyA.Name,_copyA.My_Pet.Name);Console.ReadKey();}}}

运行结果: