C# 使用反射來實現(xiàn)對象的深度復(fù)制方法
實現(xiàn)方式
通過挨個羅列的方式一次復(fù)制子對象是非常耗費(fèi)人力的,如果子對象是引用類型,則還要需要考慮是否對子對象進(jìn)一步深拷貝。
實際應(yīng)用中,一個類如果有幾十個子對象,挨個復(fù)制對于開發(fā)人員來說索然無味比較費(fèi)時費(fèi)力。
所以使用反射機(jī)制來實現(xiàn)。
但是如果是服務(wù)端運(yùn)行的話,還是建議手動的實現(xiàn)。
畢竟反射機(jī)制比直接寫出來的效率要慢一些。
代碼:
public static class DeepCopyHelper { public static object Copy(this object obj) { Object targetDeepCopyObj; Type targetType = obj.GetType(); //值類型 if (targetType.IsValueType == true) { targetDeepCopyObj = obj; } //引用類型 else { targetDeepCopyObj = System.Activator.CreateInstance(targetType); //創(chuàng)建引用對象 System.Reflection.MemberInfo[] memberCollection = obj.GetType().GetMembers(); foreach (System.Reflection.MemberInfo member in memberCollection) { if (member.MemberType == System.Reflection.MemberTypes.Field) { System.Reflection.FieldInfo field = (System.Reflection.FieldInfo)member; Object fieldValue = field.GetValue(obj); if (fieldValue is ICloneable) { field.SetValue(targetDeepCopyObj, (fieldValue as ICloneable).Clone()); } else { field.SetValue(targetDeepCopyObj, Copy(fieldValue)); } } else if (member.MemberType == System.Reflection.MemberTypes.Property) { System.Reflection.PropertyInfo myProperty = (System.Reflection.PropertyInfo)member; MethodInfo info = myProperty.GetSetMethod(false); if (info != null) { object propertyValue = myProperty.GetValue(obj, null); if (propertyValue is ICloneable) { myProperty.SetValue(targetDeepCopyObj, (propertyValue as ICloneable).Clone(), null); } else { myProperty.SetValue(targetDeepCopyObj, Copy(propertyValue), null); } } } } } return targetDeepCopyObj; } }
以上這篇C# 使用反射來實現(xiàn)對象的深度復(fù)制方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言中隊列的結(jié)構(gòu)和函數(shù)接口的使用示例
隊列只允許一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊列具有先進(jìn)先出FIFO的性質(zhì);隊列可用數(shù)組和鏈表 的方法實現(xiàn),使用鏈表的結(jié)構(gòu)實現(xiàn)更優(yōu)一些,因為如果使用數(shù)組節(jié),出隊列時刪去首元素需要將整個數(shù)組前移,效率比較低2023-02-02C語言數(shù)據(jù)結(jié)構(gòu)之 折半查找實例詳解
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之 折半查找實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06