C# List引用类型的克隆
2019-01-21 23:30
567 查看
有时候我们想克隆一个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]特性
相关文章推荐
- C# List Contains()用于引用类型的使用
- C#中完美克隆引用类型的对象
- C#中完美克隆引用类型的对象
- 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
- 【C#】List列表的深复制,引用类型深复制
- 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复
- CLR Via C# 学习笔记(1) 基元类型 值类型 引用类型
- C# 命名空间"DevExpress.XtraReports.UserDesigner"中不存在类型或命名空间名称"XRTabbedMdiManager"。是否缺少程序集引用?
- C# 值类型与引用类型的异同
- C#中值类型和引用类型
- List<int>是值类型还是引用类型
- C#中的引用类型和值类型
- 【C#】值类型与引用类型
- C#学习基本概念之传递引用类型参数(二)
- 04.C#类型系统、值类型和引用类型(二章2.2-2.3)
- 面试题: c#值类型和引用类型
- [java.io]关于List对象的引用是自定义类型写入文件
- [学习笔记]Asp.net(C#)菜鸟进级系列之引用类型
- C# 引用类型作为函数参数时
- [CLR via C#]5.2 引用类型和值类型