欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-12 09:23:22
前言 有时候我们想克隆一个list去做别的事,而不影响原来的list,我们直接在list后面加上小点点,发现并没有clone这样的扩展函数。这时候就只有自己扩展了。 尝...

前言

有时候我们想克隆一个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);
}

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

注意事项:

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

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

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

总结

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

上一篇:

下一篇: