前言
有時(shí)候我們想克隆一個(gè)List去做別的事,而不影響原來的List,我們直接在list后面加上小點(diǎn)點(diǎn),發(fā)現(xiàn)并沒有Clone這樣的擴(kuò)展函數(shù)。這時(shí)候就只有自己擴(kuò)展了。
嘗試了三種方式,測試都通過了,至于性能方面我還沒有做測試。
下面話不多說了,來一起看看詳細(xì)的介紹吧
一、反射
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);}
注意事項(xiàng):
第一種方式無需任何依賴。
第二種方式需要Newtonsoft.Json,如果項(xiàng)目中沒有用到它,不推薦使用這種方式。
第三種方式序要給引用類型實(shí)體加上[Serializable]特性
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答
圖片精選