zoukankan      html  css  js  c++  java
  • 深拷贝,深复制

    --

    using System;
    using System.Reflection;
    
    namespace 深拷贝N2
    {
        public static class ObjectCopier
        {
    
    
    
            /// <summary>
            /// 使用反射
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <returns></returns>
            public static T DeepCopyByReflect<T>(T obj)
            {
                //如果是字符串或值类型则直接返回
                if (obj is string || obj.GetType().IsValueType) return obj;
                object retval = Activator.CreateInstance(obj.GetType());
                FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                foreach (FieldInfo field in fields)
                {
                    try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); }
                    catch { }
                }
                return (T)retval;
            }
    
            /// <summary>
            /// 跳过 List 属性字段
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="obj"></param>
            /// <param name="skipList"></param>
            /// <returns></returns>
            public static T DeepCopyByReflect<T>(T obj, bool skipList)
            {
                //如果是字符串或值类型则直接返回
                if (obj is string || obj.GetType().IsValueType) return obj;
                object retval = Activator.CreateInstance(obj.GetType());
                FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                foreach (FieldInfo field in fields)
                {
                    try
                    {
                        if (skipList && field.FieldType.Name.Contains("List"))
                        {
                            continue;
                        }
    
                        field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj), skipList));
                    }
                    catch { }
                }
                return (T)retval;
            }
    
        }
    }

    ---

  • 相关阅读:
    iOS9下App Store新应用提审攻略
    信息安全系统设计基础第十一周学习总结
    Linux第十一次学习笔记
    信息安全系统设计基础第十周学习总结
    Linux第八次学习笔记
    Linux第七次实验笔记
    家庭作业3.67
    Linux第六次学习笔记
    Linux第五次学习笔记
    Linux第四次学习笔记
  • 原文地址:https://www.cnblogs.com/runliuv/p/11477968.html
Copyright © 2011-2022 走看看