前言
网核心(开放源代码,跨平台,x-copy可部署等)有许多令人兴奋的方面,其中最值得称赞的就是其性能了。关于对象转换已经有不少轮子(自动映射器,TinyMapper ).出于项目需要,手动造一个简单轮子。下面话不多说了,来一起看看详细的介绍吧。
示例代码
g1 .采用静态泛型类缓存,避免了拆箱装箱操作。
2.对于转换对象中有,字段名一样但是类型不一样的类时仍可以用
公共静态类地图来源,目标其中TSource :类其中t目标:类{公共只读静态功能来源,目标地图静态映射器(){ if(Map==null)Map=GetMap();} private static FuncTSource,t target map(){ var source type=type of(t source);var TargetType=typeof(目标);变量参数表达式=表达式.参数(sourceType,' p ');var member expression=GetExpression(参数表达式,sourceType,目标类型);变量=表达式LambdaFuncTSource,t target(memberiteexpression,parameter expression);返回.compile();} ///摘要///根据转换源和目标获取表达式树////summary////param name='参数表达式'表达式参数p/param ///param名称='sourceType '转换源类型/param ///param name='targetType '转换目标类型/param /返回/返回私有静态成员表达式GetExpression(表达式参数表达式,类型sourceType,类型目标类型){ var成员绑定=new ListMemberBinding();目标类型中的foreach (var targetItem).GetProperties().其中(x=x .属性类型。ispublic x . CanWrite)){ var source item=source type .GetProperty(targetItem .名称);//判断实体的读写权限if (sourceItem==null ||!sourceItem .CanRead || sourceItem .PropertyType。IsNotPublic)继续;//标注未映射特性的属性忽略转换if (sourceItem .GetCustomAttributeNotMappedAttribute()!=null)继续;定义变量属性表达式=表达式。属性(parameterExpression,source item);//判断都是班级且类型不相同时if (targetItem .属性类型IsClass sourceItem .属性类型IsClass targetItem .PropertyType!=sourceItem .PropertyType) { if (targetItem .PropertyType!=targetType)//防止出现自己引用自己无限递归{ var MemberInit=GetEXPRESSion(属性EXPRESSion,sourceItem .属性类型,目标项目属性TYPe);会员登记.添加(表达式绑定(targetItem,MemberInit));继续;} } if (targetItem .PropertyType!=sourceItem .PropertyType)继续;会员登记.添加(表达式Bind(targetItem,属性EXPRESSion));}返回表达式。成员信息(表达式新建(目标类型),成员绑定);} }3.调用方法如下
(1)构造样例类
公共类一个{ public int Id { get设置;}公共字符串名称{获取设置;}公共C用户{获取设置;} ///摘要///标注为未映射特性时,不转换赋值////总结[系统组件模型。数据注释。架构。not mapped]public D UserA { get;设置;} }公共类B { public int Id { get设置;}公共字符串名称{获取设置;}公共D用户{获取设置;}br数据-已过滤='已过滤'公共D UserA { get设置;}}公共类C { public int Id { get设置;}公共字符串名称{获取设置;}}公共类D { public int Id { get设置;}公共字符串名称{获取设置;}} (2) 调用
var a=新的A{ Id=1,名称='张三,用户=新的C { Id=1,名称='李四' }};brB b=地图,B。地图(a);//得到转换结果4.性能测试
定义变量长度=10000000;var listA=new listA();for(int I=0;一、长度;i ) { listA .添加(新的A { Id=i,名称='张三,用户=新的C { Id=i,名称='李四' } });} var sw=秒表StartNew();for(int I=0;一、长度;I){ var item=listA[I];var b=新的B { Id=item .标识,名称=项目。名称,用户=新的李四', } };} sw .stop();控制台WriteLine($)原生的时间:{sw .elapsedmirisseconds秒} ms’);//表达式地图,B。地图(列表[0]);//预先编译缓存西南航空restart();for(int I=0;一、长度;I){ 0地图,B。地图(列表[I]);} sw .stop();控制台WriteLine($)表达式的时间:{sw .elapsedmirisseconds秒} ms’);//自动映射器自动映射器。映射器。初始化(克重=克重.CreateMapA,B());西南航空restart();for(int I=0;一、长度;i ) { var b=AutoMapper .映射器。MapB(ListA[I]);} sw .stop();控制台WriteLine($'AutoMapper时间:{sw .elapsedmirisseconds秒} ms’);//TinyMapper TinyMapper .BindA,B();西南航空restart();for(int I=0;一、长度;i ) { var b=TinyMapper .MapB(listA[I]);} sw .stop();控制台WriteLine($'TinyMapper时间:{sw .elapsedmirisseconds秒} ms’);控制台ReadLine();5.1000万数据不带子类集结果
6.1000万数据带子类集结果
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。