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

    ---

  • 相关阅读:
    spark编译报错信息简介
    [LintCode]各位相加
    [算法]头条面试—奇数位升序偶数位降序链表排序
    [算法]循环打印矩阵,蛇形矩阵专题
    [LeetCode]146.LRU缓存机制
    [算法]死磕递归和动态规划专题算法
    Storm学习笔记——高级篇
    fail-fast和fail-safe
    阿里巴巴面试之利用两个int值实现读写锁
    [爬虫]Python爬虫进阶
  • 原文地址:https://www.cnblogs.com/runliuv/p/11477968.html
Copyright © 2011-2022 走看看