zoukankan      html  css  js  c++  java
  • 类实例的拷贝

    问题情境:

      需要完全复制(深拷贝)另一个实例,以保留现有的对象作后续处理等作用。

    原理综述:

      对象的浅拷贝仅需在该类中添加一个方法:

            public MyImage clone()
            {
                return this.MemberwiseClone() as MyImage;
            }

      深拷贝有几种:

      针对可序列化([Serializable])的类,可以声明利用二进制或序列化进行拷贝的方法。网上有我不再赘述。

      不方便序列化的类,利用反射。具体做法见下。

    解决代码:

            public static MyImage Clone(MyImage obj)
            {
                if (obj is string || obj.GetType().IsValueType)
                    return obj;
                object retval = Activator.CreateInstance(obj.GetType(), new object[] { ((MyImage)obj).MyBitmap });//调用有参构造函数进行初始化,懒得进行具体分类讨论思考合成一个方法,借鉴者可以考虑下
                FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance);
                foreach (var field in fields)
                {
                    try
                    {
                        field.SetValue(retval, Clone2(field.GetValue(obj)));
                    }
                    catch { }
                }
                return (MyImage)retval;
            }
    
            private static T Clone2<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.Static | BindingFlags.Instance);
                foreach (var field in fields)
                {
                    try
                    {
                        field.SetValue(retval, Clone2(field.GetValue(obj)));
                    }
                    catch { }
                }
                return (T)retval;
            }

      

  • 相关阅读:
    机器学习-聚类问题
    机器学习--回归问题
    CreateRemoteThread盲注提权原理分析
    Linux下进程隐藏的方法及其对抗
    常见未授权访问漏洞总结
    Windows日志识别入侵痕迹
    打造自己的弱口令扫描工具
    Linux 命令被劫持,应急处理办法
    攻击Java Web应用--思维导图
    新型横向移动工具原理分析、代码分析、优缺点以及检测方案
  • 原文地址:https://www.cnblogs.com/gaara-zhang/p/12157811.html
Copyright © 2011-2022 走看看