0x01 - 我的第一个 Object Visitor
我的第一个 Object Visitor
预演准备
为了顺利的进行测试,你需要确保本地已经安装了以下这些必备的软件:
- dotnet 2.1 或者以上版本的 SDK,我们更建议直接安装 dotnet 5 SDK。下载地址:https://dotnet.microsoft.com/download
- 安装一个趁手的 .net IDE。本演示过程将会使用 Visual Studio Code 作为基础演示 IDE。你也可以选择 Rider 或者 Visual Studio 来完成。
创建测试项目
我们需要一个测试项目来演示如何创建一个属于你的第一个 Object Visitor。
首先,确保本地已经正确安装了 dotnet 2.1 或者以上版本的 sdk,你可以运行以下命令来确认当前安装的版本:
dotnet --info |
然后,随便找一个你喜欢的文件夹,运行以下命令来创建用于演示的测试控制台程序:
dotnet new console |
最后,继续运行以下命令来安装最新的 Newbe.ObjectVisitor 工具包:
dotnet add package newbe.objectvisitor |
这样,用于测试的项目就创建完成了。
创建一个简单的数据模型
我们使用 IDE 打开刚刚创建的项目,添加一个简单的数据模型类 OrderInfo
:
public class OrderInfo |
实现一个拼接所有属性的逻辑
我们在 Program.cs 中添加以下代码来完成这些逻辑:
new
一个OrderInfo
order
- 使用
StringBuilder
将order
的所有属性名称和值拼接在一起 - 输出最后的
string
using System; |
我们使用以下命令来运行写好的逻辑:
dotnet run |
就会得到以下这样的结果:
OrderId: 1 |
使用 Object Visitor 再次实现上面的逻辑
我们通过 Newbe.ObjectVisitor 来一样实现上面的逻辑:
- 使用
V()
扩展方法来创建一个 Object Visitor - 调用 Object Visitor 的
ForEach
方法来注册 Visit 过程的行为 - 运行创建好的 Object Visitor
using System; |
运行这个代码,你将会得到和上一节相同的结果。
那这么做究竟带来了什么好处?
首先,使用 Object Visitor 可以动态的适应模型类的变化,这点好处非常明显。
当 OrderInfo
中的属性增加时,“拼接部分” 的代码可以不用变化,实现动态的适配。
另外,还有一些好处是本示例没有体现的,将会在后续的文档中进行介绍:
- 它的运行效率很高。根据已有的基准测试,其性能表征和直接硬编码差距很小。
- 可以使用丰富的方式来对需要访问的属性进行多种方式过滤,例如:基于
Attribute
的过滤。 - 有了这种方式之后可以很轻松的扩展出基于对象属性的其他功能,例如:对象的属性验证(FluentValidation),对象的映射(AutoMapper)和对象的比较(Comparer)。
那这和直接使用反射有什么区别?
使用反射来实现以上的效果也是可以的,但相较来说,Object Visitor 的实现方式在性能方面根据优势:
- 根据已有的基准测试,Object Visitor 基于表达式树实现,其运行效率要比直接使用反射相关的读写方法高出许多。
- Object Visitor 提供了基于泛型,在一些特定的场景可以完全避免装箱拆箱所带来的开销。
本篇小结
到这里,你已经初步了解了什么是 Newbe.ObjectVisitor,以及其基本的用法。
不过,这只是演示代码,展现的内容非常有限,因此,你还可以继续阅读下篇来进一步了解更多紧张刺激的特性。
发布说明
- Newbe.ObjectVisitor 0.4.4 发布,模型验证器上线
- Newbe.ObjectVisitor 0.3.7 发布,自动生成 FluentAPI
- Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
- Newbe.ObjectVisitor 0.1.4 发布,初始版本
使用样例
- Newbe.ObjectVisitor 样例 1
- 0x01 - 我的第一个 Object Visitor
- 0x02 - 创建并缓存 Object Visitor
- 0x03-ForEach 全面观
- 0x04 - 过滤属性
- 0x05 - 综合示例,导出 CSV
开发文档可能随版本发生变化,查看最新的开发文档需移步 http://cn.ov.newbe.pro
番外分享
GitHub 项目地址:https://github.com/newbe36524/Newbe.ObjectVisitor
Gitee 项目地址:https://gitee.com/yks/Newbe.ObjectVisitor
- 本文作者: newbe36524
- 本文链接: https://www.newbe.pro/Newbe.ObjectVisitor/001-my-fisrt-object-visitor/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
0x01 - 我的第一个 Object Visitor的更多相关文章
- 在Salesforce中对某一个Object添加自定义的Button和Link
在Salesforce中可以对某一个Object添加自定义的Button和Link,来完成特定的逻辑过程,接下来以一个简单的实例来描述整个处理流程,实现的基本功能和我另外一篇文章中描述的功能是一致的( ...
- 在Salesforce中可以对某一个Object的Standard Button或Link进行重写
在Salesforce中可以对某一个Object的Standard Button或Link进行重写,来实现我们特定的逻辑过程,比如:在删除某个Object之前要判断该Object的某个Field的状态 ...
- 在Salesforce中对某一个Object添加 Validation Rule
在Salesforce中可以对某一个Object添加相应的 Validation Rule 来进行一个全局的条件判断,比如满足什么样的条件的修改允许提交,不满足的要提示相应的错误信息. 要创建一个Va ...
- new一个Object对象占用多少内存?
Java的自动内存管理机制省却了很多编码工作,大大地提高了Java的生产力,而且JVM的性能也越来越好,特别是G1的出现,改善了垃圾回收中stop the world的状况. 也许很多人都没有考虑过这 ...
- [转]new一个Object对象占用多少内存?
我们分解下ArrayList arr = new ArrayList();等同于ArrayList arr = null;//初始化arr = new ArrayList();//实例化这两个过程.初 ...
- list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作
list,set等集合遍历时,不能remove集合中的元素.需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAl ...
- php 分享一个object(stdclass)转数组的函数
经常调用一个借口之后 返回的内容是json串,利用php函数json_decode() 解析json串之后得到的 数据类型为object(stdclass) 这是一个对象,要取其中的内容也可以 取得, ...
- 小程序的picker的range 是一个 Object Array (对象数组)
小程序的picker的range 是一个 Object Array (对象数组) 数据: array: [{'id':1,'name':'Android'},{'id':2,'name':'IOS'} ...
- django保存一个object的时候会发出信号
当django保存一个object的时候会发出一系列的signals,可以通过对这些signals注册listener,从而相应的signal发出时执行一定的代码. from django.core. ...
- 好用的一个object c 宏
好用的一个object c 宏 from https://github.com/justzt/ios-helper/blob/master/Macro.h // // Macro.h // Photo ...
随机推荐
- 【Spring Boot】我的第一个Spring Boot练习
背景 Spring 在 Java 生态的企业级开发项目中极其常用,通常我们为项目引入一项新技术时,不得不考虑如何将新技术与 Spring 整合在一起. 我们知道,预研一项新技术,我们基于 MVP(最简 ...
- Python - qrcode(二维码模块)
import qrcode codeText = 'https://www.cnblogs.com/houhuilinblogs' img = qrcode.make(codeText) print( ...
- MD5 - windows也可以查询某个文件的MD5码
命令格式 certutil -hashfile 文件名称 md5 示例 Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation ...
- 数据挖掘 | 数据隐私(4) | 差分隐私 | 差分隐私概论(下)(Intro to Differential Privacy 2)
L4-Intro to Differential Privacy 拉普拉斯机制(Laplace Mechanism) 上一节课中,我们讨论了随机响应,这是一种适合于单个位的隐私化.这种算法一般来说并不 ...
- camunda工作流实战项目【PRO版】(表单设计器+流程编辑器,零代码创建流程)
pro版本主要对流程设计器.表单模块做了优化和改造,下面是各版本功能对比 一.整体情况介绍 基于ruoyi平台和camunda工作流开发而成,结合bpmn.js流程编辑器和vform表单设计器,实现常 ...
- 一个简单的PHP单文件路由类示例
<?php class Router { protected $routes = array(); protected $basePath; public function __construc ...
- go 定时任务库 cron
简介 在Linux中,Cron是计划任务管理系统,通过crontab命令使任务在约定的时间执行已经计划好的工作,例如定时备份系统数据.周期性清理缓存.定时重启服务等. 本文介绍的cron库是一个用于管 ...
- 爬虫管理平台-TaskPyro的任务管理
官网:https://docs.taskpyro.cn/ 任务管理 TaskPyro提供了强大而灵活的任务管理功能,让您能够轻松创建和管理Python脚本的定时任务. 创建任务 在TaskPyro中创 ...
- BUUCTF---萌萌哒的八戒(猪圈密码)
1. 问题 2.知识点 猪圈密码 3.解题 对应解题,套上flag{whenthepigwanttoeat}
- nginx 部署配置
下载nginx 包(http://nginx.org/en/download.html) nginx常用命令: nginx -s stop 快速关闭Nginx,可能不保存相关信息,并终止w ...