第
使用c#实现简易的类型转换(Emit,Expression,反射)
哈喽。大家好,好久不见,最近遇到了一个场景,就是在FrameWork的mvc中,有个系统里面使用的是EntityFramework的框架,在这个框架里,提供了一个SqlQuery的方法,这个方法很好用啊,以至于在EFCORE8里面又添加了回来,不过不知道性能怎么样,我遇到的场景是通过SqlQuery查询的时候,转换很慢,我估计那背后大概率是使用反射造成的,因为我的查询可能有上十万,甚至更多,就导致了这个转换的过程及其耗时,以至于刚开始我是想通过Emit等方式去实现一个高性能转换,可是到最后没有去弄,因为我用了DataCommand去查询,最后循环DataReader来实现硬赋值,这样性能是最好,一下减少了好多秒,提升了80%,但也给了我一个灵感,一个实现简易的类型转换的灵感,所以在上周我就把代码写了出来,不过由于工作的忙碌,今天才开始写博客,接下来就呈上。
对了,有关EMIT和表达式树的知识,诸位可以看我之前的博客表达式树,IL。其中IL有两合集。
众所周知,我们的c#代码在编译器编译,都会编译成IL代码,最后再去通过JIT转化为机器码,运行在系统中去的,所以IL代码的性能是比c#代码高的,同时,学习的成本,编写的成本也是机器高,我也是在自己感兴趣,瞎琢磨,就会了一丝丝皮毛,很多人说IL难写,其实,对于代码中的Opcodes那些,我只记一些常用的,对于剩下的,我都是在写的时候才去看文档,总之呢,要学的东西有很多,但掌握了学习的方法,才是持之以恒的手段。
接下来,就呈上IL代码,分为两部分,一个是List转List,一个是实体转实体的。
在这几个例子中,所有的前提都是实体的属性名称是一样的,如果需要扩展类型不一样,或者哪些不转换,从哪个属性转换到哪个属性,就需要各位自己去扩展了,本来我是想写这些的,,但是懒癌犯了,哈哈哈哈,需要各位看官自己动手了,以下代码,除了反射,其他的我都加了注释,反射大家都看得懂。
在下面的第一个方法,我们定义了执行转换集合的方法,并返回了一个委托,我们在实际开发中,都可以返回委托,最终可以将方法缓存起来,这样在后续的时候直接调用,性能提升爆炸,因为你每次创建Emit方法的时候,耗时也会挺长的,在有时候,像哪些主流的Mapper,他们内部肯定都做了缓存。下面的集合转集合,大致的原理代码就是定义一个方法ConvertToType,返回类型是ListTR,入参是ListT,然后定义循环的开始结束变量,以及最终返回结果集,还有循环内部的时候,我们创建的变量,最终将这个变量添加到返回的结果集中,在往下就是拿入参集合的数量,定义循环开始和结束的label,在往下走就是,初始化返回值集合,赋值给本地的localRes变量,将0赋值给开始循环的变量,也就是for(inti=0),下面就是给结束的循环值赋值为入参集合的Count。
下面的代码每行基本都有注释,所以我在这里也不做过多的讲解。
集合和单个的区别就在于集合是多了一个循环的主体,其他都和单个是一样的,以及集合的代码块中,我没有添加trycatch的代码块。
internalclassEmitExecuteT,TR:IExecuteT,TRwhereT:classwhereTR:class,new()
publicFuncListT,ListTRExecuteList()
vardynamicMethod=newDynamicMethod(ConvertToType,typeof(ListTR),newType[]{typeof(ListT)});
#region变量定义
varilMethod=dynamicMethod.GetILGenerator();
varlocalBegin=ilMethod.DeclareLocal(typeof(int));//定义循环开始变量
varlocalEnd=ilMethod.DeclareLocal(typeof(int));//结束变量
varlocalres=ilMethod.DeclareLocal(typeof(ListTR//返回值
varlocalSignleRes=ilMethod.DeclareLocal(typeof(TR));//变量
varcountMethod=typeof(ListT).GetProperty(Count).GetGetMeth
您可能关注的文档
- 江南的花作文参考7篇.docx
- 小班新生家长会发言稿(18篇).docx
- 新员工年会个人发言稿(范文16篇).docx
- 高中军训结束演讲稿范文(3篇).docx
- 中学班长竞选优秀演讲稿(6篇).docx
- 初三快毕业演讲稿(8篇万能).docx
- 学校禁毒教育主持词(共18篇).docx
- Python 中如何编写类型提示.docx
- 小学五年级关于诚信的演讲稿(6篇).docx
- 家长会家长优秀的发言稿范文(31篇).docx
- 宣贯培训(2026年)《NYT 4512-2025 非洲菊疫病抗性鉴定技术规程》.pptx
- 宣贯培训(2026年)《NYT 4514-2025木薯副产物综合利用导则》.pptx
- 宣贯培训(2026年)《NYT 4513-2025木薯全程机械化生产技术规范》.pptx
- 宣贯培训(2026年)《NYT 4470-2025全株玉米青贮质量分级》.pptx
- 宣贯培训(2026年)《NYT 4468-2025玉米供需平衡表编制规范》.pptx
- 宣贯培训(2026年)《NYT 4469-2025全株玉米青贮质量评定 综合指数法》.pptx
- 宣贯培训(2026年)《NYT 4474-2025东北地区玉米-大豆轮作生产技术规程》.pptx
- 宣贯培训(2026年)《NYT 4472-2025玉米耐盐碱鉴定评价技术规程》.pptx
- 宣贯培训(2026年)《NYT 4473-2025玉米抗旱性鉴定评价技术规程》.pptx
- 宣贯培训(2026年)《NYT 4478-2025甘薯收获技术规程》.pptx
原创力文档

文档评论(0)