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

    ---

  • 相关阅读:
    双网卡主机无法管理的故障
    hosts文件导致无法访问网站
    获取webshell的十种方法
    XSS跨站攻击
    Ubuntu 使用中的问题总结
    ubuntu linux 13.04更新
    mysql root密码重置
    防火墙工作模式简介
    SE 2014年4月30日
    SE 2014年4月29日
  • 原文地址:https://www.cnblogs.com/runliuv/p/11477968.html
Copyright © 2011-2022 走看看