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;
            }
    
        }
    }

    ---

  • 相关阅读:
    09.session #
    08.cookie
    07.中间件
    06.类视图
    374. 猜数字大小 力扣 二分 简单却易错
    278. 第一个错误的版本 力扣 二分 简单
    1449. 数位成本和为目标值的最大数字 力扣 动态规划 难 string赋值和比较
    279. 完全平方数 力扣 动态规划 中等
    518. 零钱兑换 II 力扣 动态规划,中等吧
    203. 移除链表元素 力扣
  • 原文地址:https://www.cnblogs.com/runliuv/p/11477968.html
Copyright © 2011-2022 走看看