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

戏精分享 C#表达式树,第一季正式完稿

前不久,我们发布了《只要十步,你就可以应用表达式树来优化动态调用》。

观众们普遍反映文章的内容太多复杂不太容易理解。

因此,我们以此为契机发布了《戏精分享 C#表达式树》系列视频。现在,第一季的视频已经正式完稿,发布到了 B 站之上。

各位可以前往以下地址来查看内容:https://www.bilibili.com/video/BV15y4y1r7pK

Newbe.ObjectVisitor 0.1.4 现已可用

Newbe.ObjectVisitor 帮助开发者可以用最简单的最高效的方式访问一个普通 class 的所有属性。从而实现:验证、映射、收集等等操作。

例如, 在你的代码中有这样一个简单的类。

var order = new OrderInfo();

你想要将这个类所有的属性和值都打印出来,那么你可以采用反射来完成:

for(var pInfo in typeof(OrderInfo).GetProperties())
{Console.Writeline($"{pInfo.Name}: {pInfo.GetValue(order)}");
}

如果你使用这个类库,则可以采用以下方式来实现一样的效果:

// call .V what is a static extension method
// you get a visitor object for order
var visitor = order.V();visitor.ForEach(context=>{var name = context.Name;var value = context.Value;Console.Writeline($"{name}: {value}");
}).Run();// you can also make it into one line
order.V().ForEach(c=> Console.Writeline($"{c.Name}: {c.Value}")).Run();// or using quick style
order.FormatToString();

那我为什么要这样做?

  • 因为这样更快!这个类库使用表达式树实现,因此它拥有比直接使用反射快上 10 倍的性能.

  • 因为这样更可读!通过这个类库你可以使用链式 API 和命名方法来创建一个委托,这样可以让你的代码实现和硬编码同样的可读效果。

  • 因为这样更具扩展性!如果使用了这个类库,你就拥有了一个简便的方法来访问一个类所有的属性。因此,你就做很多你想做的事情,比如:创建一个验证器来验证你的模型,修改一些可能包含敏感数据的属性从而避免输出到日志中,创建一个类似于 AutoMapper 的对象映射器但是拥有更好的性能,诸如此类。

我们发布了第一个版本。0.1 版本中我们完成了最基础的 ForEach API,并且实现了 FormatString 方法。

我们对初始版本进行了基准测试。得出了以下结论,详细的内容也可以前往仓库首页查看:

  1. 该类库可以实现和硬编码一样快速的性能。

  2. 该类库比直接使用反射更快。

  3. 对于非代码热点路径,即使使用非缓存方式调用也仍然在可接受范围内容。

Cache
NoCache

目前,我们还有很多计划中的 API

iconremark
✔️it is already avaliable in latest version
????still in plan or development and will be changed or removed
it is removed form the latest version

var o = new Yueluo();using Newbe.ObjectVisitor;//✔️ from 0.1
// V is a static extension method
var visitor = o.V();//✔️ from 0.1
// create visitor from factory method
var visitor = typeof(Yueluo).V();//✔️ from 0.1
// create and fire way.
// this is the most simple structure about this lib
// there are Name, Value, PropertyInfo, SourceObj, SourceObjType and etc in the context
o.V().ForEach((context)=>{}).Run();
o.V().ForEach((name,value)=>{}).Run();//✔️ from 0.1
// create a visitor with extend object as parameter
o.V().WithExtendObject<Yueluo, StringBuilder>().ForEach((context)=>{var _ = context.ExtendObject}).Run(new StringBuilder());
o.V().WithExtendObject<Yueluo, StringBuilder>().ForEach((name,value,stringBuilder)=>{}).Run(new StringBuilder());//✔️ from 0.1
// create and cache way. This is suggested way to use.
// cache object visitor to run it with anothor object
var cachedVisitor = deafult(Yueluo).V().ForEach((context)=>{}).Cache();
cachedVisitor.Run(new Yueluo());//✔️ from 0.1
// cache object visitor with extend object
var cachedVisitor = deafult(Yueluo).V().WithExtendObject<Yueluo, StringBuilder>().ForEach((context)=>{var _ = context.ExtendObject}).Cache();
cachedVisitor.Run(new Yueluo(), new StringBuilder());//???? you can modify value if return a new value
o.V().ForEach((context)=>context.Value.SubString(0,1)).Run();//✔️ from 0.1
// get debug info about expression now
var debugInfo = o.V().ForEach((context)=>{}).GetDebugInfo();//???? generate code in C# as a string about expression now
var code = o.V().ForEach((context)=>{}).GenerateCode();//✔️ from 0.1
// generate a lambda func
var func = o.V().ForEach((context)=>{}).GetLambda();//???? foreach properties with specified type
o.V().ForEach<string>((context)=>{}).Run();//????  using linq to filter
o.V().AsEnumerable().Where((context)=>context.Name == "YueLuo").ForEach((context)=>{}).Run();//????  suppending visiting sub object
o.V().SuppendSubObject().ForEach((context)=>{}).Run();//????  suppending visiting enumerable object
o.V().SuppendEnumerable().ForEach((context)=>{}).Run();/**✔️ from 0.1sample to join all properties to string
*/
var sb = new StringBuilder();
o.V().ForEach((context)=>{sb.Append(context.Name);sb.Append(context.Value);sb.Append(Enviroment.Newline);
}).Run();
var s = sb.ToString();//✔️ from 0.1
// quick style for above
var s = o.FormatString();//???? Deconstruct as C# 7 but more flexible
var destructor1 = Destructor<Yueluo>.Property(x=>x.Name).Property(x=>x.Age)var destructor2 = Destructor<Yueluo>.Property(x=>x.Name).Property(x=>(long)x.Age)var destructor3 = Destructor<Yueluo>.Property(x=>x.Name).Property(x=>x.NickName).Property(x=>x.Age)var (name, age) = o.V().Destruct(destructor1).Run();
var (name, ageInLong) = o.V().Destruct(destructor2).Run();
var (name, nickName, age) = o.V().Destruct(destructor3).Run();// namespace for operation with collections
using Newbe.ObjectVisitor.Collections;/**????collect properties into a dictionary
*/var dic1 = o.V().CollectAsDictionary().Run();
// quick style for above
var dic1 = o.V().ToDictionary();/**????apply value from a dictionary to object
*/
o.V().ApplyFromDictionary(dic).Run();
// quick style for above
o.V().FromDictionary(dic);// namespace for data validation
using Newbe.ObjectVisitor.Validation;// ????create rule to validation
var rule = ValidateRule<Yueluo>.GetBuilder().Property(x=>x.Name).Required().Length(2,10).Property(x=>x.Age).Range(0, int.MaxValue).Property(x=>x.Password).Validate(value=>ValidatePassword(value)).Property(x=>x.Level).Validate(value=>value + 1 >= 0).Build();o.V().Validate(rule).Run();
o.Validate(rule);// ????validate data in flunet api
// attribute-based enabled by default
o.V().Validate(v=>v.Property(x=>x.Name).Required().Length(2,10).Property(x=>x.Age).Range(0, int.MaxValue).Property(x=>x.Password).Validate(value=>ValidatePassword(value)).Property(x=>x.Level).Validate(value=>value + 1 >= 0)
).Run();// ????suppending attribute-based validation
o.V().SuppendAttributeValidation().Validate(v=>v.Property(x=>x.Name).Required().Length(2,10).Property(x=>x.Age).Range(0, int.MaxValue).Property(x=>x.Password).Validate(value=>ValidatePassword(value)).Property(x=>x.Level).Validate(value=>value + 1 >= 0)
).Run();// ????suppending sub-object validation
// validate whole object
o.V().SuppendSubObject().SuppendAttributeValidation().Validate(v=>v.Validate(x=>x.NewPassword == x.OldPassword).Validate(x=>ValidateFormDb(x)).Property(x=>x.Name).Required().Length(2,10).Property(x=>x.Age).Range(0, int.MaxValue).Property(x=>x.Age).If(x=>x.Name == "123").Range(0, int.MaxValue).Property(x=>x.Password).Validate(value=>ValidatePassword(value)).Property(x=>x.Level).Validate(value=>value + 1 >= 0)
).Run();// namespace for Task
using Newbe.ObjectVisitor.Task;// ????async way
await o.V().ForEachAsync((context)=>{}).RunAsync();// ????controlling concurrency
await o.V().ForEachAsync((context)=>{}).WhenAsync(tasks=>Task.WhenAll(tasks)).RunAsync();// namespace for Microsoft.Extensions.DependencyInjection
using Newbe.ObjectVistory.DepencyInjection;// ????inject services to the properties of this object
this.V().ForEach(context=>this.ServiceProvider.GetService(context.PropertyInfo.PorpertyType)).Run();// ????quick style for above
this.V().PropertyInject(this.ServiceProvider);

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

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

相关文章

BCVP,想真正为社区做努力的开发者们

基于Net/Core&#xff0c;快速搭建 API & SPA 及微服务应用组织BASE NETCORE (VUE) PROJECT TEAM每一个.NET开发者都可以通过自己的开源项目(最好可以配套简单发表些文章)在这里进行分享&#xff0c;BCVP开发者组织的意义就是激发和挖掘更多的作品&#xff0c;可能偏基础&a…

求关系模式r的所有候选码_2_1关系数据库的基本概念

1.关系数据结构单一的数据结构-------关系现实世界中的实体以及实体间各种联系均用关系来表示2.域&#xff1a;一组具有相同数据类型的值的集合。例如&#xff1a;整数实数介于某个取值范围的整数指定长度的字符串集合{“男”&#xff0c;“女”}.............3.笛卡尔积3.1 给…

Docker:恢复对开源项目的无限制访问

喜欢就关注我们吧&#xff01;继宣布针对免费用户的拉速限制声明之后&#xff0c;Docker 现如今又透露了进一步的策略更新&#xff0c;旨在恢复对开源项目的无限制访问。Docker 方面此表示&#xff0c;为了支持开源社区&#xff0c;他们为开源项目制定了一个特殊的计划&#xf…

真正拖垮你的,是沉没成本

职场&认知洞察 丨 作者 / findyi这是findyi公众号分享的第91篇原创文章一个洋友问&#xff1a;“洋哥&#xff0c;我在这家创业公司3年了&#xff0c;但老板承诺的股份一直没兑现。现在想离开&#xff0c;但又特别不甘心&#xff0c;我应该怎么做”。我回复&#xff1a;“找…

别“躺”着了,赶紧把「复盘」做起来

大家好&#xff0c;我是Z哥。有一种类型的故事大多数人都喜欢&#xff0c;就是“屌丝逆袭”的故事&#xff0c;这也是很多小说的题材。不管是在小说还是现实中&#xff0c;这样的逆袭都不是一蹴而就的。并且&#xff0c;大多数人一直只在逆袭的路上&#xff0c;最终能成功完成逆…

注意.NET Core进行请求转发问题

【导读】近日&#xff0c;有关注我公众号的小伙伴私信我&#xff0c;遇到一个问题搞了很久没解决&#xff0c;此问题具有参考意义&#xff0c;这里跟大家分享下&#xff0c;希望对你能有所帮助内网环境跟外网隔离&#xff0c;现在外网的请求都需要一个专用服务器转接到内网处理…

react 数字转字符_深入浅出 React -- JSX

什么是 JSXJSX 是一个 JavaScript 的语法扩展。JSX 可能会使人联想到模版语言&#xff0c;但它具有 JavaScript 的全部功能在 React 中&#xff0c;JSX 仅仅是 React.createElement(component, props, ...children) 函数的语法糖如下 JSX 代码&#xff1a;<MyButton color&q…

mybatis mysql schema_MyBatis学习 之 一、MyBatis简介与配置MyBatis+Spring+MySql

一、MyBatis简介与配置MyBatisSpringMySql1.1MyBatis简介MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。MyBatis 摒除了大部分的JDBC代码、手工设置参数和结果集重获。MyBatis 只使用简单的XML 和注解来配置和映射基本数据类型、Map 接口和POJO 到数据库记录。…

.NET架构小技巧(7)——做好小的项目

一屋不扫&#xff0c;何以扫天下。再说也没有那么多天下(大系统)可扫&#xff0c;更多的是一个个自己居住的小屋(手边的小项目&#xff0c;子模块)&#xff0c;所以认真的开始扫自己的小屋。在visual studio中&#xff0c;解决方案(Solution)下可以创建多个项目(Project)&#…

使用 C# 9.0 新语法提升 if 语句美感

C# 语言一贯秉承简洁优美的宗旨&#xff0c;每次升级都会带来一些语法糖&#xff0c;让我们可以使代码变得更简洁。本文分享两个使用 C# 9.0 提升 if 语句美感的技巧示例。使用属性模式代替 IsNullOrEmpty在任何你使用 IsNullOrEmpty 的时候&#xff0c;可以考虑这样替换&#…

在 Azure App Service 上启用 Application Request Routing

点击上方蓝字关注“汪宇杰博客”导语我们在IIS上经常使用 Application Request Routing (ARR) 模块做反向代理。Azure App Service 使用的也是 IIS&#xff0c;照理来说应该也能做反代&#xff0c;但默认情况下它是不行的&#xff0c;我们来看看如何给在 App Service 上启用 AR…

【专题】多角度深入解析开放原子开源基金会

喜欢就关注我们吧&#xff01;2020 年 9 月 9 日&#xff0c;开放原子开源基金会正式对外发声&#xff0c;同天&#xff0c;宣布百度超级链正式成为基金会首个捐赠项目。9 月 10 日&#xff0c;华为 OpenHarmony 操作系统开源&#xff0c;开放原子开源基金会获捐 OpenHarmony。…

C#刷剑指Offer | 【常考题】最小的k个数

【C#刷题】| 作者 / Edison Zhou这是EdisonTalk的第299篇学习分享我们来用之前学到的数据结构知识来刷《剑指Offer》的一些核心题目&#xff08;精选了其中30道题目&#xff09;&#xff0c;希望对你有帮助&#xff01;本文题目为&#xff1a;最小的k个数。1题目介绍题目&#…

晶振噪声及杂散_晶振如何匹配电容看了就知道

描述一、什么是晶振了解晶振之前&#xff0c;我们先来看一下我们最为熟悉的51单片机&#xff0c;我们都知道51单片机最小系统包括供电电源、复位电路以及晶振系统。这是CPU能跑起来的最基本条件。由此我们可以看到晶振在电路当中的作用&#xff0c;那就是晶振电路用于产生时间频…

C# 中的 ref 已经被放开,或许你已经不认识了

一&#xff1a;背景 1. 讲故事最近在翻 netcore 源码看&#xff0c;发现框架中有不少的代码都被 ref 给修饰了&#xff0c;我去&#xff0c;这还是我认识的 ref 吗&#xff1f;就拿 Span 来说&#xff0c;代码如下&#xff1a;public readonly ref struct Span<T>{public…

java中file_详细介绍Java中的File类

构造方法File f new File("文件路径")File f new File("parent","child")创建一个文件&#xff1a;//在工作空间目录下创建a.txt的文件File f new File("a.txt");f.createNewFile();在G:\路径下创建一个a.txt的文件.如果已经有的话…

.NET5全面拥抱Azure云,微软市值重回巅峰,那些年吹过的牛,都实现了!

“Microsoft Azure的重要性在于&#xff0c;它是继Windows取代DOS之后&#xff0c;微软的又一次颠覆性转型——通过在互联网架构上打造全新计算平台&#xff0c;使得Windows真正由PC和服务器延伸到“蓝天”上。” ------曾微软全球副总裁张亚勤2014年2月&#xff0c;纳德拉成为…

大象起舞——微软研发如何保持创新力和敏捷性

我有幸见证微软在近五年的变革&#xff0c;也作为局内人学习如此一个全球性的、庞大的研发团队是如何管理、自我调整和创新的。上周五应邀给一个大客户的研发中心做了一个分享&#xff0c;其中我深刻地认识到有几点创新是一种文化。作为企业需要用心营造这样一种文化&#xff0…

java 云架构_java版Spring Cloud云架构代码结构构建

本篇我们根据架构图进行代码的构建。根据微服务化设计思想&#xff0c;结合spring cloud一些优秀的项目&#xff0c;如服务发现、治理、配置化管理、路由负载、安全控制等优秀解决方案&#xff0c;使用Maven技术将框架进行模块化、服务化、原子化封装并构建&#xff0c;也为后期…

集赞有礼!进击吧! Blazor !第六期 企业内部应用建设实战

集赞有礼转发此文章至朋友圈&#xff0c;截止至直播结束前&#xff1a;集赞满20个&#xff0c;可获得Blazor贴纸&#xff1b;集赞满50个&#xff0c;可获得微软帆布包&#xff1b;集赞满88个&#xff0c;可获得笔记本&#xff1b;集赞最多的一位小伙伴将获得充电宝哦&#xff0…