C# 使用反射來實現(xiàn)對象的深度復(fù)制方法
更新時間:2017年01月18日 11:12:10 投稿:jingxian
下面小編就為大家?guī)硪黄狢# 使用反射來實現(xiàn)對象的深度復(fù)制方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
實現(xiàn)方式
通過挨個羅列的方式一次復(fù)制子對象是非常耗費人力的,如果子對象是引用類型,則還要需要考慮是否對子對象進(jìn)一步深拷貝。
實際應(yīng)用中,一個類如果有幾十個子對象,挨個復(fù)制對于開發(fā)人員來說索然無味比較費時費力。
所以使用反射機制來實現(xiàn)。
但是如果是服務(wù)端運行的話,還是建議手動的實現(xiàn)。
畢竟反射機制比直接寫出來的效率要慢一些。
代碼:
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)文章
Qt數(shù)據(jù)庫相關(guān)應(yīng)用開發(fā)總結(jié)
這篇文章主要為大家介紹了在Qt數(shù)據(jù)庫應(yīng)用開發(fā)中的一些經(jīng)驗總結(jié),以及一些組件的使用介紹。文中的示例代碼講解詳細(xì),需要的可以參考一下2022-02-02

