究竟是什么可以比反射还快实现动态调用?| Source Generators版

前言

最近在公众号上看到一篇文章《究竟是什么可以比反射还快实现动态调用?》,它使用的是Newbe.ObjectVisitor,基于C#表达式树访问一个普通class的所有属性和对应的值,可以拥有比直接使用反射快上10倍的性能。

就这一需求来说,我认为Source Generators应该会更快,因为访问代码在编译时而不是运行时就生成了。

事实也验证了确实如此:

2ab9a43b49583a63b0d2cd0b77eceb5f.png

实现

这次我们使用第三方开发的Source Generators类库来实现。

1.引用Nuget包

创建示例控制台程序,引用如下Nuget包:

AOPMethodsCommon
AOPMethodsGenerator

2.设置Attribute

在需要动态调用的类上声明Attribute:

[AutoMethods(template = TemplateMethod.CustomTemplateFile, CustomTemplateFileName = "template.txt")]
public class Yueluo

3.代码模板

添加template.txt,用在Source Generators生成动态调用代码的模板.

内容如下:

using System;
using System.Collections.Generic;
using System.CodeDom.Compiler;
using System.Runtime.CompilerServices;
namespace {{NamespaceName}} {public static class {{ClassName}}Extentions{public static string ValueStringProperty(this {{ClassName}} obj, string val){{{~ for mi in Properties ~}}{{~ if( mi.ReturnType  == "string" ) ~}}if(string.Compare("{{mi.Name}}",val,StringComparison.CurrentCultureIgnoreCase)==0) {return obj.{{mi.Name}};}{{~ end ~}}{{~ end ~}}throw new ArgumentException("cannot find "+ val);}public static int ValueIntProperty(this {{ClassName}} obj, string val){{{~ for mi in Properties ~}}{{~ if( mi.ReturnType  == "int" ) ~}}if(string.Compare("{{mi.Name}}",val,StringComparison.CurrentCultureIgnoreCase)==0) {return obj.{{mi.Name}};}{{~ end ~}}{{~ end ~}}throw new ArgumentException("cannot find "+ val);}public static object ValueProperty(this {{ClassName}} obj, string val){{{~ for mi in Properties ~}}if(string.Compare("{{mi.Name}}",val,StringComparison.CurrentCultureIgnoreCase)==0) {return obj.{{mi.Name}};}{{~ end ~}}throw new ArgumentException("cannot find "+ val);}}
}

模板使用了scriban进行解析,具体语法详见:https://github.com/scriban/scriban/blob/master/doc/language.md

ValueStringProperty方法举例来说:

public static string ValueStringProperty(this {{ClassName}} obj, string val){{{~ for mi in Properties ~}}{{~ if( mi.ReturnType  == "string" ) ~}}if(string.Compare("{{mi.Name}}",val,StringComparison.CurrentCultureIgnoreCase)==0) {return obj.{{mi.Name}};}{{~ end ~}}{{~ end ~}}throw new ArgumentException("cannot find "+ val);
}

遍历类的所有属性(Properties),判断当前属性返回类型(mi.ReturnType)是string,则返回对应属性名的值。

4.使用

下面是Benchmark测试代码,分别使用了Newbe.ObjectVisitorSource Generators

[Benchmark]
public string GetterString()=> ValueGetter<Yueluo, string, string>.GetGetter(_nameProperty).Invoke(_yueluo);[Benchmark]
public int GetterInt()=> ValueGetter<Yueluo, int, int>.GetGetter(_ageProperty).Invoke(_yueluo);[Benchmark]
public string GetterString2()
{ return _yueluo.ValueStringProperty("Name"); 
}[Benchmark]
public int GetterInt2()
{return  _yueluo.ValueIntProperty("Age");
}

可以看到,Source Generators生成的代码可读性更高。

结论

对于编译时可生成的功能,尽量使用Source Generators实现,可以达到更好的性能和可读性。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

只要懂得拒绝,哪会有什么狗血感情与莫名其妙的误会

1 就凭你&#xff1f;也想握朕的手&#xff1f;2 来&#xff0c;快站好~抱好娃&#xff01;拍全家福啦&#xff01;3 自我约束有利于家庭和谐&#xff0c;嗯&#xff01;4 问题来了&#xff0c;你是夜灯党还是漆黑党&#xff1f;你点的每个赞&#xff0c;我都认真当成了喜欢

android笔记之在WebView中显示ProgressBar的两种方法

http://blog.csdn.net/liuzhidong123/article/details/6450334 本文基于Creative Commons Attribution 2.5 China Mainland License发布&#xff0c;欢迎转载&#xff0c;演绎或用于商业目的&#xff0c;但是必须保留本文的署名http://www.cnblogs.com/luminji&#xff08;包含…

绝对不能错过!2009~2019 高中数学联赛11年真题解析

全世界只有3.14 % 的人关注了爆炸吧知识参加过高中数学联赛的同学都知道&#xff0c;全国高中数学联赛作为中国数学会及各省、市、自治区数学会的一项经常性工作&#xff0c;是属于较高等级的数学竞赛&#xff0c;其地位远高于各省自行组织的数学竞赛。为什么这个竞赛会这么特别…

在Win7中怎样打开摄像头?

在Win7中怎样打开摄像头&#xff1f;标题所说的问题在我装了win7后也遇到了&#xff0c;当时我也只会用等下我说的第一个方法打开摄像头&#xff0c;不过幸运的是我在前些天了解到了另外一个方法&#xff0c;那么现在我先讲下这个问题出现的原因吧&#xff1a;在Win7推出后就因…

活久见啊,WPF工资已经这么高了!

金九银十高薪季&#xff0c;WPF招聘大厂多高薪多&#xff0c;阿里影视、百度地图、华为小米、小鹏特斯拉、美的碧桂园等都在招WPF人才&#xff0c;薪资30w起步&#xff0c;真心太牛了&#xff01;为何WPF上位机自动化能异军突起&#xff1f;其实就是站在了IOT物联网的风口&…

视图加载时自动执行铵钮事件

再学习一个方法&#xff0c;就是在ASP.NET MVC视图加载时&#xff0c;让jQuery自动执行一个铵钮事件。在控制器添加一个Action操作&#xff1a; 先在视图实现一个铵钮事件&#xff1a; 看看上面运行时的效果&#xff0c;当视图加载时&#xff0c;需要人为去点击铵钮&#xff0c…

硕博士的朋友圈都有哪些特点?

全世界只有3.14 % 的人关注了爆炸吧知识很多同学都会有这种感觉&#xff0c;读了硕士博士后&#xff0c;兴趣会突然间发生很大变化&#xff0c;发朋友圈也会不一样了。而真正决定人与人之间的差距的&#xff0c;其实是我们对事物的见识与内心的格局&#xff0c;见识的深浅决定人…

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题目录一、触屏事件连带触发鼠标事件的问题二、DataGrid 误触问题及解决方法独立观察员 2021 年 10 月 10 日一、触屏事件连带触发鼠标事件的问题这个是 WPF 已知的问题&#xff0c;网络上也有一些讨论&#xff0c;但是没有…

听说,99%的数学家都算不出这道题

全世界只有3.14 % 的人关注了爆炸吧知识著名的数学家毕达哥拉斯曾说&#xff1a;“朋友是你灵魂的倩影&#xff0c;要像220与284一样亲密。”就因为不经意的一句话&#xff0c;引发了一场数群和数学家长达几千年的“斗争”&#xff0c;甚至到现在依然没有结束&#xff01;无数个…

oracle账号区分大小写吗,实战Oracle 11g用户密码不区分大小写

连接到:Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsSQL> show  parameter sec_case_sensitive_logonNAME TYPE VAL…

sql 多表多行模糊查询_从零开始学习SQL(五)多表查询

经过之前的学习&#xff0c;现在我们已经对查询有了一定的了解&#xff0c;但是我们目前的所有查询都只能找到在一张表中的数据&#xff0c;但如果我们需要寻找分布在多张表格中的数据时&#xff0c;这种之前的查询就做不到了&#xff0c;这时就需要引入一种新的查询方法&#…

最新.NET MAUI有什么惊喜?

点击蓝字关注我们.NET 6 RC1 现已发布啦&#xff0c;我们为 .NET 多平台应用程序 UI (MAUI) 引入了所有的新布局。这是性能和可靠性的重大变化。我们很高兴我们还增加了一些关于accessibility方面的基于新的SemanticService、字体缩放选项和对Xamarin.Forms 效果的兼容性的功能…

亲一下就搞定的事,绝不花钱解决!

1 好了&#xff0c;你表演吧&#xff0c;球不看了2 “你这个车&#xff0c;至少得100条小鱼干啊” 3 羡慕了4 还…还有这种操作&#xff1f;5 被秀了一脸哈哈哈6 没有什么是一个么么哒解决不了的&#xff01;你点的每个赞&#xff0c;我都认真当成了喜欢

微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版

微软今天发布了Visual Studio 2022 最接近正式发布的RC版本&#xff0c;同时宣布在11月8日发布正式版&#xff0c;届时将在线上发布虚拟的发布活动&#xff0c;具体参见&#xff1a;https://devblogs.microsoft.com/visualstudio/join-us-november-8th-for-the-launch-of-visua…

arcgis oracle trace,ArcGIS应用Oracle Spatial特征分析

该文章并不是将Oracle Spatial与ST_Geometry做对比&#xff0c;关于两者的对比&#xff0c;可以参考&#xff1a;http://www.linuxidc.com/Linux/2011-10/45492.htm&#xff0c;这里从数据结构&#xff0c;到性能对比&#xff0c;都描述的很清楚。其实这篇文件就是说明一下在A…

SharePoint Timer Job

首先介绍一下什么是定时器作业&#xff0c;说的再多&#xff0c;也不如一张图说的清楚这两张图应该把我想说的已经表达清楚了&#xff0c;下一步介绍一下如何自定义Timer Job第一步&#xff1a;创建一个类&#xff08;CustomTimerJob.cs&#xff09;第二步&#xff1a;引用 usi…

这次使用一个最舒服的姿势插入HttpClient拦截器技能点

码甲哥继续在同程艺龙写一点大前端&#xff0c;今天我们来了解一下如何拦截axios请求/响应&#xff1f;这次我们举一反三&#xff0c;用一个最舒适的姿势插入这个技能点。本文阅读耗时5 minute&#xff0c;行文耗时5 Days。axios是一个基于 promise 的网络请求库&#xff0c;可…

甜蜜助攻!情侣之间,到底能有多甜甜甜甜甜甜甜甜

▲ 点击查看没有一丝丝防备&#xff0c;还有 5 天&#xff0c;七夕就要到了。如何借「物」聊表爱意&#xff0c;大概是最近让很多拥有另一半的人头疼不已的问题。重点是&#xff0c;礼物挑不好&#xff0c;小心七夕就变送命题&#xff01;女孩子们到底喜欢什么礼物&#xff1f;…

多个查询语句能否一次把结果导出_mysql表中base64格式数据查询

需求&#xff1a;为了避开特殊字符(如&#xff1a;单引号)影响&#xff0c;把某些字段保存为base64格式。SQL语句直接解码base64编码数据&#xff0c;直接查询出原始数据。表中数据如下很不直观&#xff0c;当根据where条件查询时&#xff0c;肉眼不能直接从结果提取到可读信息…

【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表

第一次弄RDL报表. 权当自己的一个随手笔记吧.希望能有好的意见或者建议欢迎大家提出来. 一起学习.灰常欢迎.. 第一步,先找出你的Reporting Server 的 URL . 如图&#xff1a; 其中URL 就是ReportingServer 的URL 在新建的aspx页面部署的时候非常重要. 虚拟目录的话,在WIN 7 上…