打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
扩大IList对象,实现深拷贝扩大办法,上海软件开发|上海软件开发公司|软件定制|医院高校...

应用处景



对一个凑集进行深拷贝复制,实现的办法有不少,现举一个常规实现规划:例如已有一个List<T> someList



List<T> newList = new List<T>();
foreachvar item in someList)
{
T t = new T();
//此处的属性若是是引用类型,还须要推敲该类型的深拷贝实现
t.P1 = item.P1;
t.P2 = item.P2;

     ...
newList.Add(t);
}


若是类似的需求不止一个,那我们就要反复书写类似的代码,这显然不合适代码重用的原则。



思路



起首想到的应当是扩大办法,并且是基于泛型的扩大办法,这个简单,上代码:



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对象,并且挨个给属性赋值,那岂不是也很麻烦,这时辰必然有同窗想到了反射,对,应用反射可以解决这个题目,但我认为还不是很幻想。


第二次思虑。。。对了,微软不是已经为我们供给了一个接口叫ICloneable的么?我们应当为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;
}


如今看上去还不错了,根蒂根基思路已经成型,在调用的时辰可以如许应用: newList = someList.Clone();


当然,别忘了给你的T加上ICloneable接口,并实现Clone办法,实现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;
}


应用序列化的体式格式进行对象的复制,如许做的前提是你的Class须要被标识表记标帜为Serializable。



应用EF时碰着的实际案例



例如一个Entity有很多接洽关系的实体(主子表),如今须要复制原始记录作为一份全新的记录,包含所有的子表,若是采取常规办法,做起来是会很繁琐的,须要挨个遍历子表凑集,并new一个全新的实体对象,再挨个履行AddObject,若是采取上方的规划,代码如下:



//子表凑集
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实现ICloneable接口,并实现Clone办法即可,须要重视的是,若是EF采取DB First体式格式,则须要在Clone办法里面把EntityKey设置为null,不然,在调用AddObject的时辰,ObjectManagement会抛出异常。



总结



 长处:代码简单、复费用高
       毛病:须要批改类对象以持续ICloneable接口,若是没有基类的话,也是一个很麻烦的题目,并且类对象须要被标识表记标帜为Serializable

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C#中实现任意类的完美克隆
五步掌握OOM框架AutoMapper基本使用
计算机世界网-周报全文-接口继承与多态
原型模式(Prototype Pattern)
条款27:避免ICloneable接口
C#装箱和拆箱(Boxing 和 UnBoxing)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服