C#深拷贝方法
2024-10-21 03:14:56
- 概述
为什么要用到深拷贝呢?比如我们建了某个类Person,并且实例化出一个对象,然后,突然需要把这个对象复制一遍,并且复制出来的对象要跟之前的一模一样,来看下我们一般会怎么做。
- 方法一(利用反射实现)
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;
} 方法二(利用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;
}方法三(利用二进制序列化和反序列实现)
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;
}- 方法四(DataContractSerializer实现)
//利用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;
最新文章
- JSP脚本中的9个内置对象
- boot from volume
- javascript Date 总结
- Android数据存储(一)----SharedPreferences详解
- [转]通过继承ConfigurationSection,在web.config中增加自定义配置
- Jquery手册
- OC 实例变量(instance var)与属性(@property)的关系 isa指针
- 面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结
- [USACO1.2.2]方块转换 Transformations
- Java中double类型的数据精确到小数点后两位
- poj 1469(二分图 最大匹配)
- shell中的条件表达式
- 1.9 From Native to HTML5
- H5 video标签的第二种格式
- .net 多态
- ASP.NET新增数据返回自增ID
- 6月3 Smarty基础读取配置
- Nginx安装 默认虚拟主机 Nginx用户认证 Nginx域名重定向
- 使用API失效供应商地址Demo(转)
- windows 下python导入excel