應(yīng)用處景對一個湊集進(jìn)行深拷貝復(fù)制,實(shí)現(xiàn)的辦法有不少,,現(xiàn)舉一個常規(guī)實(shí)現(xiàn)規(guī)劃:例如已有一個List<T> someList List<T> newList = new List<T>(); ... 若是類似的需求不止一個,那我們就要反復(fù)書寫類似的代碼,,這顯然不合適代碼重用的原則。 思路起首想到的應(yīng)當(dāng)是擴(kuò)大辦法,,并且是基于泛型的擴(kuò)大辦法,,這個簡單,,上代碼: public static IList<T> Clone<T>(this IList<T> source) 這個add辦法里還是要new一個T對象,并且挨個給屬性賦值,,那豈不是也很麻煩,,這時辰必然有同窗想到了反射,對,,應(yīng)用反射可以解決這個題目,,但我認(rèn)為還不是很幻想。 第二次思慮,。,。。對了,,微軟不是已經(jīng)為我們供給了一個接口叫ICloneable的么,?我們應(yīng)當(dāng)為T加上束縛,批改代碼如下: public static IList<T> Clone<T>(this IList<T> source) 如今看上去還不錯了,,根蒂根基思路已經(jīng)成型,,在調(diào)用的時辰可以如許應(yīng)用: newList = someList.Clone(); 當(dāng)然,別忘了給你的T加上ICloneable接口,,并實(shí)現(xiàn)Clone辦法,,實(shí)現(xiàn)Clone的辦法有很多,小我建議如下: public object Clone() 應(yīng)用序列化的體式格式進(jìn)行對象的復(fù)制,,如許做的前提是你的Class須要被標(biāo)識表記標(biāo)幟為Serializable。 應(yīng)用EF時碰著的實(shí)際案例例如一個Entity有很多接洽關(guān)系的實(shí)體(主子表),,如今須要復(fù)制原始記錄作為一份全新的記錄,,包含所有的子表,若是采取常規(guī)辦法,,做起來是會很繁瑣的,,須要挨個遍歷子表湊集,并new一個全新的實(shí)體對象,,再挨個履行AddObject,,若是采取上方的規(guī)劃,代碼如下: //子表湊集 如許代碼就精簡了很多,,對本來的批改也相對較小,,只須要把TModel的基類EntityObjectBase實(shí)現(xiàn)ICloneable接口,并實(shí)現(xiàn)Clone辦法即可,,須要重視的是,,若是EF采取DB First體式格式,,則須要在Clone辦法里面把EntityKey設(shè)置為null,不然,,在調(diào)用AddObject的時辰,ObjectManagement會拋出異常,。 總結(jié) 長處:代碼簡單,、復(fù)費(fèi)用高 |
|