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); }
注意事项:
第一种方式无需任何依赖。
第二种方式需要newtonsoft.json,如果项目中没有用到它,不推荐使用这种方式。
第三种方式序要给引用类型实体加上[serializable]特性
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。