zoukankan      html  css  js  c++  java
  • C# List引用类型的克隆

    有时候我们想克隆一个List去做别的事,而不影响原来的List,我们直接在list后面加上小点点,发现并没有Clone这样的扩展函数。这时候就只有自己扩展了。

    尝试了三种方式,测试都通过了,至于性能方面我还没有做测试。

    一、反射

     1  public static List<T> Clone<T>(this List<T> list) where T : new()
     2         {
     3             List<T> items = new List<T>();
     4             foreach (var m in list)
     5             {
     6                 var model = new T();
     7                 var ps = model.GetType().GetProperties();
     8                 var properties = m.GetType().GetProperties();
     9                 foreach (var p in properties)
    10                 {
    11                     foreach (var pm in ps)
    12                     {
    13                         if (pm.Name == p.Name)
    14                         {
    15                             pm.SetValue(model, p.GetValue(m));
    16                         }
    17                     }
    18                 }
    19                 items.Add(model);
    20             }
    21             return items;
    22         }

    二、序列化(依赖Newtonsoft.Json)

    1  public static List<T> Clone<T>(this List<T> list) where T : new()
    2         {
    3             var str = JsonConvert.SerializeObject(list);
    4             return JsonConvert.DeserializeObject<List<T>>(str);
    5         }

    三、序列化(BinaryFormatter)

     1 public static List<T> Clone<T>(this List<T> list)
     2         {
     3             using (Stream objectStream = new MemoryStream())
     4             {
     5                 IFormatter formatter = new BinaryFormatter();
     6                 formatter.Serialize(objectStream, list);
     7                 objectStream.Seek(0, SeekOrigin.Begin);
     8                 return (List<T>)formatter.Deserialize(objectStream);
     9             }
    10         }

    测试

    1 private void Test()
    2 {
    3     List<NormalSetting> list = new List<NormalSetting>();
    4     list.Add(new NormalSetting { RedisIp = "123" });
    5     List<NormalSetting> items = list.Clone();
    6     list[0].RedisIp = "456";
    7     logMessager.Show("{0}:{1}", list[0].RedisIp, items[0].RedisIp);
    8 }

    注意事项:

    第一种方式无需任何依赖。

    第二种方式需要Newtonsoft.Json,如果项目中没有用到它,不推荐使用这种方式。

    第三种方式序要给引用类型实体加上[Serializable]特性

  • 相关阅读:
    Air-WIFI使用方法
    libeasy代码学习:一次简单的TCP请求处理流程
    log_pipe日志收集分析系统介绍
    asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法
    用命令行实现“一键休眠”
    C#几个经常用到的字符串的截取
    MYSQL存储过程怎么写
    如何用myeclipse和eclipse搭建安卓开发环境
    C#随机生成不重复字符串
    Inno setup 简单打包教程
  • 原文地址:https://www.cnblogs.com/cglandy/p/10301548.html
Copyright © 2011-2022 走看看