C# List引用類型克隆的3種方法
前言
有時(shí)候我們想克隆一個(gè)List去做別的事,而不影響原來(lái)的List,我們直接在list后面加上小點(diǎn)點(diǎn),發(fā)現(xiàn)并沒(méi)有Clone這樣的擴(kuò)展函數(shù)。這時(shí)候就只有自己擴(kuò)展了。
嘗試了三種方式,測(cè)試都通過(guò)了,至于性能方面我還沒(méi)有做測(cè)試。
下面話不多說(shuō)了,來(lái)一起看看詳細(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);
}
}
測(cè)試
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):
第一種方式無(wú)需任何依賴。
第二種方式需要Newtonsoft.Json,如果項(xiàng)目中沒(méi)有用到它,不推薦使用這種方式。
第三種方式序要給引用類型實(shí)體加上[Serializable]特性
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
C# winform主界面打開(kāi)并關(guān)閉登錄界面的方法
這篇文章主要介紹了C# winform主界面打開(kāi)并關(guān)閉登錄界面的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
基于C#設(shè)計(jì)一個(gè)雙色球選號(hào)工具
這篇文章主要為大家詳細(xì)介紹了如何利用C#設(shè)計(jì)實(shí)現(xiàn)一個(gè)雙色球選號(hào)工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
C#讀寫(xiě)EXCEL單元格的問(wèn)題實(shí)現(xiàn)
這篇文章主要介紹了C#讀寫(xiě)EXCEL單元格的問(wèn)題實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果
這篇文章主要介紹了Winform實(shí)現(xiàn)鼠標(biāo)可穿透的窗體鏤空效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10

