软件编程
位置:首页>> 软件编程>> C#编程>> C#中4种深拷贝方法介绍

C#中4种深拷贝方法介绍

作者:junjie  发布时间:2023-01-02 21:16:11 

标签:C#,深拷贝

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;

补充:第一个已经通过递归实现了深拷贝。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com