软件编程
位置:首页>> 软件编程>> C#编程>> C# 使用反射来实现对象的深度复制方法

C# 使用反射来实现对象的深度复制方法

作者:jingxian  发布时间:2021-10-27 19:50:01 

标签:C#,反射,对象,深度复制

实现方式

通过挨个罗列的方式一次复制子对象是非常耗费人力的,如果子对象是引用类型,则还要需要考虑是否对子对象进一步深拷贝。

实际应用中,一个类如果有几十个子对象,挨个复制对于开发人员来说索然无味比较费时费力。

所以使用反射机制来实现。
 
但是如果是服务端运行的话,还是建议手动的实现。

毕竟反射机制比直接写出来的效率要慢一些。

代码:


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);  //创建引用对象
      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;
  }
}
0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com