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]特性

  • 相关阅读:
    基于FPGA的均值滤波算法实现
    QuartusII 13.0 PLL IP Core调用及仿真
    varnish-4.x VCL之grace mode
    varnish-4.x VCL之cookie及缓存时间
    varnish-4.x VCL之强制cache miss
    Mariadb-Galera10二进制包安装
    MariaDB Replication
    MariaDB 使用CONNECT存储引擎
    MariaDB 使用TokuDB存储引擎
    Ubuntu启用VNC服务的配置
  • 原文地址:https://www.cnblogs.com/cglandy/p/10301548.html
Copyright © 2011-2022 走看看