类实例的拷贝

Posted gaara-zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类实例的拷贝相关的知识,希望对你有一定的参考价值。

问题情境:

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

原理综述:

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

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

 

  

以上是关于类实例的拷贝的主要内容,如果未能解决你的问题,请参考以下文章

类实例的拷贝

片段必须是公共静态类才能从实例状态正确重新创建

java 代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

Android 逆向使用 DB Browser 查看并修改 SQLite 数据库 ( 从 Android 应用数据目录中拷贝数据库文件 | 使用 DB Browser 工具查看数据块文件 )(代码片段

创建片段而不从 java 代码实例化它