久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

擴(kuò)大IList對象,,實(shí)現(xiàn)深拷貝擴(kuò)大辦法,上海軟件開發(fā)|上海軟件開發(fā)公司|軟件定制|醫(yī)院高校...

 kittywei 2012-03-05

應(yīng)用處景



對一個湊集進(jìn)行深拷貝復(fù)制,實(shí)現(xiàn)的辦法有不少,,現(xiàn)舉一個常規(guī)實(shí)現(xiàn)規(guī)劃:例如已有一個List<T> someList



List<T> newList = new List<T>();
foreachvar item in someList)
{
T t = new T();
//此處的屬性若是是引用類型,還須要推敲該類型的深拷貝實(shí)現(xiàn)
t.P1 = item.P1;
t.P2 = item.P2;

     ...
newList.Add(t);
}


若是類似的需求不止一個,那我們就要反復(fù)書寫類似的代碼,,這顯然不合適代碼重用的原則。



思路



起首想到的應(yīng)當(dāng)是擴(kuò)大辦法,,并且是基于泛型的擴(kuò)大辦法,,這個簡單,,上代碼:



public static IList<T> Clone<T>(this IList<T> source)
{
IList<T> newList = new List<T>(source.Count);
foreachvar item in source)
{
newList.Add(..);
}
return newList;
}


這個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)
where T : ICloneable
{
IList<T> newList = new List<T>(source.Count);
foreachvar item in source)
{
newList.Add((T)((ICloneable)item.Clone()));
}
return newList;
}


如今看上去還不錯了,,根蒂根基思路已經(jīng)成型,,在調(diào)用的時辰可以如許應(yīng)用: newList = someList.Clone();


當(dāng)然,別忘了給你的T加上ICloneable接口,,并實(shí)現(xiàn)Clone辦法,,實(shí)現(xiàn)Clone的辦法有很多,小我建議如下:



        public object Clone()
{
MemoryStream stream = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream,, this);
stream.Position = 0;
var obj = formatter.Deserialize(stream) as Class;
return obj;
}


應(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ī)劃,代碼如下:



//子表湊集
var resList = this.ResourcePlanService.GetList(t => t.QuoteID == quoteId).ToList();
ForeachCopy(resList,, this.ResourcePlanService);

private void ForeachCopy<TModel,, TService>(IList<TModel> list, TService service)
where TService : IService<TModel>
where TModel : ICloneable
{

list.Clone().ForEach( t => service.Add(t) );

}


如許代碼就精簡了很多,,對本來的批改也相對較小,,只須要把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)用高
       毛病:須要批改類對象以持續(xù)ICloneable接口,,若是沒有基類的話,,也是一個很麻煩的題目,并且類對象須要被標(biāo)識表記標(biāo)幟為Serializable

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多