标签:member each 保留 初始 his 二进制 针对 flag 合成
问题情境:
需要完全复制(深拷贝)另一个实例,以保留现有的对象作后续处理等作用。
原理综述:
对象的浅拷贝仅需在该类中添加一个方法:
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; }
标签:member each 保留 初始 his 二进制 针对 flag 合成
原文地址:https://www.cnblogs.com/gaara-zhang/p/12157811.html