当前位置: 移动技术网 > IT编程>开发语言>c# > C# List引用类型克隆的3种方法

C# List引用类型克隆的3种方法

2019年07月18日  | 移动技术网IT编程  | 我要评论

前言

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

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

下面话不多说了,来一起看看详细的介绍吧

一、反射

public static list<t> clone<t>(this list<t> list) where t : new()
  {
   list<t> items = new list<t>();
   foreach (var m in list)
   {
    var model = new t();
    var ps = model.gettype().getproperties();
    var properties = m.gettype().getproperties();
    foreach (var p in properties)
    {
     foreach (var pm in ps)
     {
      if (pm.name == p.name)
      {
       pm.setvalue(model, p.getvalue(m));
      }
     }
    }
    items.add(model);
   }
   return items;
  }

二、序列化(依赖newtonsoft.json)

 public static list<t> clone<t>(this list<t> list) where t : new()
 {
 var str = jsonconvert.serializeobject(list);
 return jsonconvert.deserializeobject<list<t>>(str);
 }

三、序列化(binaryformatter)

public static list<t> clone<t>(this list<t> list)
  {
   using (stream objectstream = new memorystream())
   {
    iformatter formatter = new binaryformatter();
    formatter.serialize(objectstream, list);
    objectstream.seek(0, seekorigin.begin);
    return (list<t>)formatter.deserialize(objectstream);
   }
  }

测试

private void test()
{
 list<normalsetting> list = new list<normalsetting>();
 list.add(new normalsetting { redisip = "123" });
 list<normalsetting> items = list.clone();
 list[0].redisip = "456";
 logmessager.show("{0}:{1}", list[0].redisip, items[0].redisip);
}

注意事项:

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

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网