最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
C# 使用反射来实现对象的深度复制方法
时间:2022-06-25 07:58:00 编辑:袖梨 来源:一聚教程网
实现方式
通过挨个罗列的方式一次复制子对象是非常耗费人力的,如果子对象是引用类型,则还要需要考虑是否对子对象进一步深拷贝。
实际应用中,一个类如果有几十个子对象,挨个复制对于开发人员来说索然无味比较费时费力。
所以使用反射机制来实现。
但是如果是服务端运行的话,还是建议手动的实现。
毕竟反射机制比直接写出来的效率要慢一些。
代码:
| 代码如下 | 复制代码 |
publicstaticclassDeepCopyHelper {
publicstaticobjectCopy(thisobjectobj) { Object targetDeepCopyObj; Type targetType = obj.GetType(); //值类型 if(targetType.IsValueType ==true) { targetDeepCopyObj = obj; } //引用类型 else { targetDeepCopyObj = System.Activator.CreateInstance(targetType); //创建引用对象 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers();
foreach(System.Reflection.MemberInfo memberinmemberCollection) { if(member.MemberType == System.Reflection.MemberTypes.Field) { System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member; Object fieldValue = field.GetValue(obj); if(fieldValueisICloneable) { field.SetValue(targetDeepCopyObj, (fieldValueasICloneable).Clone()); } else { field.SetValue(targetDeepCopyObj, Copy(fieldValue)); }
} elseif(member.MemberType == System.Reflection.MemberTypes.Property) { System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member; MethodInfo info = myProperty.GetSetMethod(false); if(info !=null) { objectpropertyValue = myProperty.GetValue(obj,null); if(propertyValueisICloneable) { myProperty.SetValue(targetDeepCopyObj, (propertyValueasICloneable).Clone(),null); } else { myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue),null); } }
} } } returntargetDeepCopyObj; } } | |
相关文章
- 《第五人格》【角色爆料】全新「求生者」——默剧艺人将于5月25日上线共研服 05-28
- 三国志将星闪耀司马懿玩法攻略|三国志将星闪耀司马懿最强阵容搭配与技能加点详解 05-28
- 饿了么食安理赔入口在哪-饿了么食安理赔如何操作 05-28
- 情报速递丨「因你曾看见」系列活动(一) 05-28
- 腐朽默示暗夜面甲获取攻略 腐朽默示暗夜面甲全渠道获取方式汇总 05-28
- 《绝地求生》41.2移除枪械一览 05-28