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

 更新时间:2015年06月17日 10:10:46   投稿:junjie  
这篇文章主要介绍了C#中4种深拷贝方法介绍,本文讲解了利用反射实现、利用xml序列化和反序列化实现、利用二进制序列化和反序列化实现、利用silverlight DataContractSerializer实现,用于在silverlight 客户端使用等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 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#实现几种数据库的大数据批量插入

    c#实现几种数据库的大数据批量插入

    这篇文章主要介绍了c#实现几种数据库的大数据批量插入,主要包括SqlServer、Oracle、SQLite和MySQL,有兴趣的可以了解一下。
    2017-01-01
  • C#实现上位机的远程监控与控制的详细步骤

    C#实现上位机的远程监控与控制的详细步骤

    随着工业自动化、物联网以及智能控制系统的普及,远程监控与控制逐渐成为了许多系统的核心需求,上位机作为控制与监测系统的核心,常用于接收处理来自下位机的数据并进行控制操作,C#作为一门高效且功能强大的编程语言,本文将探讨如何使用C#实现上位机远程监控与控制
    2025-01-01
  • 利用C#9.0新语法如何提升if语句美感

    利用C#9.0新语法如何提升if语句美感

    这篇文章主要给大家介绍了关于利用C# 9.0新语法如何提升if语句美感的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C#获取数组中最大最小值的方法

    C#获取数组中最大最小值的方法

    这篇文章主要介绍了C#获取数组中最大最小值的方法,本文直接给出实例代码,需要的朋友可以参考下
    2015-06-06
  • 利用C#代码将html样式文件与Word文档互换的方法

    利用C#代码将html样式文件与Word文档互换的方法

    这篇文章主要给大家介绍了关于利用C#代码将html样式文件与Word文档互换的方法,文中通过示例代码将两种转换介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-11-11
  • C# IP地址与整数之间转换的具体方法

    C# IP地址与整数之间转换的具体方法

    这篇文章介绍了C# IP地址与整数之间转换的具体方法,有需要的朋友可以参考一下
    2013-10-10
  • npoi2.0将datatable对象转换为excel2007示例

    npoi2.0将datatable对象转换为excel2007示例

    这篇文章主要介绍了npoi2.0将datatable对象转换为excel2007示例的相关资料
    2014-04-04
  • c# 爬取优酷电影信息(1)

    c# 爬取优酷电影信息(1)

    这篇文章主要介绍了c# 如何爬取优酷电影信息,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C#字节数组(byte[])和字符串相互转换方式

    C#字节数组(byte[])和字符串相互转换方式

    这篇文章主要介绍了C#字节数组(byte[])和字符串相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 浅谈C#六大设计原则

    浅谈C#六大设计原则

    这篇文章主要介绍了C#六大设计原则的相关内容,文中代码非常细致,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06

最新评论