栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

1:利用反射实现

public static T DeepCopy(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 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 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 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;

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/125061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号