C#中4种深拷贝方法介绍
补充:第一个已经通过递归实现了深拷贝
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 static T DeepCopy<T>(T obj)
{
object retval;
using(MemoryStream ms=new MemoryStream())
{
XmlSerializer xml = new XmlSerializer();
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.Origin);
retval=bf.Deserialize(ms);
ms.Close();
}
return (T)retval;
}
4.利用siliverlight DataContextSerializer实现,用于在sliverlight客户端中使用
public static T DeepCopy<T>(T obj)
{
object retval;
using (MemoryStream ms = new MemoryStream())
{
DataContextSerializer ser = new DataContextSerializer(typeof(T));
ser.WriteObject(ms, obj);
ms.Seek(0, SeekOrigin.Begin);
retval = ser.ReadObject(ms);
ms.Close();
}
return (T)retval;
}
C#中4种深拷贝方法介绍
最新推荐文章于 2024-06-12 16:01:05 发布