C#中4种深拷贝方法介绍
程序员文章站
2022-05-10 17:34:40
...
1:利用反射实现
public static T DeepCopy<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, DeepCopy(field.GetValue(obj))); } catch { } } return (T)retval; }
2:利用xml序列化和反序列化实现
public T DeepCopy<T>(T obj) { object retval; using (MemoryStream ms = new MemoryStream()) { XmlSerializer xml = new XmlSerializer(typeof(T)); xml.Serialize(ms, obj); ms.Seek(0, SeekOrigin.Begin); retval = xml.Deserialize(ms); ms.Close(); } return (T)retval; }
3:利用二进制序列化和反序列化实现
public static T DeepCopy<T>(T obj) { object retval; using (MemoryStream ms = new MemoryStream()) { BinaryFormatter bf = new BinaryFormatter(); //序列化成流 bf.Serialize(ms, obj); ms.Seek(0, SeekOrigin.Begin); //反序列化成对象 retval = bf.Deserialize(ms); ms.Close(); } return (T)retval; }
4:利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用
public static T DeepCopy<T>(T obj) { object retval; using (MemoryStream ms = new MemoryStream()) { DataContractSerializer ser = new DataContractSerializer(typeof(T)); ser.WriteObject(ms, obj); ms.Seek(0, SeekOrigin.Begin); retval = ser.ReadObject(ms); ms.Close(); } return (T)retval;
补充:第一个已经通过递归实现了深拷贝。
更多C#中4种深拷贝方法介绍相关文章请关注PHP中文网!
上一篇: java为什么要设计异常?
下一篇: 获取网站访客QQ,烂大街了。
推荐阅读
-
C#中的yield关键字的使用方法介绍
-
关于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法
-
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
-
C#中的应用程序接口介绍及实现,密封类与密封方法
-
C#中的yield关键字的使用方法介绍
-
C#中的两种debug方法介绍
-
C#中的两种debug方法介绍
-
关于C# 5.0 CallerMemberName CallerFilePath CallerLineNumber 在.NET4中的使用介绍方法
-
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
-
C#中的应用程序接口介绍及实现,密封类与密封方法