C#学习教程:C#实现对象复制使用表达式树CopyingofnullabletypesusingCommon的示例代码分享;使用系统;classProgram{staticvoidMain(string[]args){TestClassAclassA=newTestClassA(){PropA=newTestClass(){Name="cs1"},PropB="c1",PropC=1};TestClassAclassB=newTestClassA(){PropA=newTestClass(){Name="cs2"},PropB="c2",PropC=2};FastCopy.Copy(classA,classB,false);Console.WriteLine(classB.PropA?.Name+":"+classB.PropB+":"+classB.PropC);TestClassAclassC=newTestClassA(){PropA=newTestClass(){Name="cs1"}};TestClassAclassD=newTestClassA(){PropA=newTestClass(){Name="cs2"},PropB="c2",PropC=2};FastCopy.Copy(classC,classD,false);Console.WriteLine(classD.PropA?.Name+":"+classD.PropB+":"+classD.PropC);}}publicclassTestClassA{publicTestClassPropA{get;放;}公共字符串PropB{得到;放;公共诠释?PropC{得到;放;}}publicclassTestClass{publicstringName{get;使用System.Collections.Generic;使用System.Linq;使用System.Linq.Expressions;使用System.Reflection;使用静态System.Linq.Expressions.Expression;namespaceCommon{publicstaticclassFastCopy{staticConcurrentDictionary(Ssource,Ttarget,boolcopyNull=true){字符串名称=字符串。Format("{0}_{1}_{2}",typeof(S),typeof(T),copyNull);对象目标复制器;if(!copiers.TryGetValue(name,outtargetCopier)){Actioncopier=CreateCopier(copyNull);copiers.TryAdd(名称,复印机);targetCopier=复印机;}Actionaction=(Action)targetCopier;动作(来源,目标);}///CreateCopier(boolcopyNull){ParameterExpressionsource=Parameter(typeof(S));ParameterExpressiontarget=Parameter(typeof(T));varsourceProps=typeof(S).GetProperties(BindingFlags.Instance|BindingFlags.Public).Where(p=>p.CanRead).ToList();vartargetProps=typeof(T).GetProperties(BindingFlags.Instance|BindingFlags.Public).Where(p=>p.CanWrite).ToList();//查找可以赋值的属性varcopyProps=targetProps.Where(tProp=>sourceProps.Where(sProp=>sProp.Name==tProp.Name//name是一致的&&(sProp.PropertyType==tProp.PropertyType//属性类型一致或||sProp.PropertyType.IsAssignableFrom(tProp.PropertyType)//源属性类型是目标属性类型的子类;eg:objecttarget=stringsource;或||(tProp.PropertyType.IsValueType&&sProp.PropertyType.IsValueType&&//属性是值类型,底层类型相同,但目标属性是可空类型eg:int?num=intnum;((tProp.PropertyType.GenericTypeArguments.Length>0?tProp.PropertyType.GenericTypeArguments[0]:tProp.PropertyType)==sProp.PropertyType)))).Count()>0);List{staticActionaction=CreateCopier();///CreateCopier(){ParameterExpressionsource=Expression.Parameter(typeof(S));ParameterExpressiontarget=Expression.Parameter(typeof(T));varsourceProps=typeof(S).GetProperties(BindingFlags.Instance|BindingFlags.Public).Where(p=>p.CanRead).ToList();vartargetProps=typeof(T).GetProperties(BindingFlags.Instance|BindingFlags.Public).Where(p=>p.CanWrite).ToList();//查找可以赋值的属性varcopyProps=targetProps.Where(tProp=>sourceProps.Where(sProp=>sProp.Name==tProp.Name//name是一致的&&(sProp.PropertyType==tProp.PropertyType//属性类型一致)).Count()>0);varblock=Expression.Block(从copyProps中的p选择Expression.Assign(Expression.Property(target,p.Name),Expression.Property(source,p.Name)));Expression
