表达式的动态解析和计算,Flee用起来真香
前言
在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出;由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的时候能根据维护的表达式计算出对应的值;刚好这块和同事聊天的时候说到Flee,感觉挺好用,赶紧来和小伙伴们来分享一波。
正文
1. Flee简介
Flee是一个用于. net框架的表达式解析器和求值器,可以在运行时计算字符串表达式的值(如:sqrt(a^2 + b^2),其中a、b是变量)。它的解析和计算速度是比较快和高效的。
Flee 支持Net6.0、Net5.0、Netstandard2.1、Netstandard2.0。
其他就不多唠了,咱们直接上几个实例感受一波,更多详情小伙伴们可以去github上查阅:
github地址:https://github.com/mparlak/Flee
2. 案例演示
案例就通过控制台演示了,安装上Flee包即可。
2.1 超级简单案例
代码中有具体的注释,这里就不再详细说步骤了,截图如下:
这种简单表达式内容都已经确定,全是可以计算的,没有变量。
应用场景1:表达式固定,直接通过对应的值拼接计算的场景。
应用场景2:表达式不固定,但是公式维护时针对一些变量值用特殊字符标记,然后通过正则表达式的形式找到标记的变量,并替换为对应的业务字段值。
如:[a]+[b]+3.14,这种情况是可以通过正则表达式将中括号标记的变量找出来的,然后根据对应的中间变量的名字替换对应的值就可以计算了。
2.2 带变量的表达式
代码中有具体的注释,这里就不再详细说步骤了,截图如下:
这种带变量的形式就相对比较灵活,可以任意配置,只需在计算的时候将对应的变量附上值即可。有小伙伴可能会有疑问,变量不确定咋整啊,其实在实际应用场景中,很多时候需要传入的那些变量应该都知道,只是照着公式的规则动态传值即可。
应用场景:和简单案例中的不太一样,不需要特殊标记变量,这里直接正常维护公式正常传值即可。这种情况相对灵活,可以针对相关业务配置对应的公式,最后传对应的变量进行计算,最后根据算出的值进行相关业务处理即可。
2.3 表达式组合
CalculationEngine 可以将表达式进行组合计算,计算引擎会使用引擎内部其他表达式的结果、依赖关系,然后按顺序进行计算出组合之后的结果。
应用场景:这种情况一般用于有多个表达式的场景,就类似于Excel中多个单元格中的表达式一样,每个单元格中都有表达式,然后有一个单元格就会引用其他单元格中的表达式计算出来的值,最后得出结果。
2.4 扩展函数
有时候在项目中会将计算逻辑进行封装,只需要传入需要值即可,不需要每个调用者还得重新进行编写相关的计算逻辑,Flee也支持在表达式中组合使用自定义的函数,演示如下:
先在一个类中写好相关的方法,这里的方法一定要是静态的、公共的,如下:
然后就可以在表达式中用了,如下:
2.5 支持可变参数的函数
和上面使用方式一样,自定义一个方法,只是这个方法的参数是不确定,可变的,如下:
在表达式中使用:
2.6 返回值是Boolean类型的表达式
在实际应用场景中,有些时候只需要得到一个是否的结果,可能不需要计算一个具体的值;
应用场景:这种情况一般用于一些自动判定规则的需求,比如有一些报表的结果在不同的业务类型时会有一个值的范围,如果超出范围就代表不合规,靠人为判断的话可能就没那么高效;类似这种对比数据的情况,如果只是简单的比对还容易实现,如果是复杂一点的关系比对,这种方式就相对灵活了。
好了,使用方式就暂时说到这,文中图片已经包含所有的代码。稍后我也会把代码提交github上和码云上。
总结
上文只是列举了一些简单的使用实例,具体小伙伴们可以根据业务场景进行使用。小伙伴们如果有更好的工具库,欢迎大家留言,一起学习。
关注“Code综艺圈”,和我一起学习吧。
表达式的动态解析和计算,Flee用起来真香的更多相关文章
- Day4 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式、序列化与反序列化
一.装饰器 一.装饰器的知识储备 1.可变长参数 :*args和**kwargs def index(name,age): print(name,age) def wrapper(*args,**k ...
- C#使用表达式树动态调用方法并实现99乘法表
我们在使用C#编程的时候,经常使用反射来动态调用方法,但有时候需要动态的生成方法,下面介绍使用表达式树的方式来自动生成方法,并调用. 首先需要说明什么是表达式,熟悉Linq的程序猿都用过类似于下面的代 ...
- 闭包、装饰器decorator、迭代器与生成器、面向过程编程、三元表达式、列表解析与生成器表达式
一.装饰器 一.装饰器的知识储备 不想修改函数的调用方式,但是还想在原来的函数前后添加功能 1.可变长参数 :*args和**kwargs def index(name,age): print(na ...
- Python开发——函数【迭代器、生成器、三元表达式、列表解析】
递归和迭代 小明问路篇解释说明 递归:小明——>小红——>小于——>小东:小东——>小于——>小红——>小明 小明向小红问路,因小红不知道,所以向小于问路,因小于不 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- 理解AngularJS生命周期:利用ng-repeat动态解析自定义directive
ng-repeat是AngularJS中一个非常重要和有意思的directive,常见的用法之一是将某种自定义directive和ng-repeat一起使用,循环地来渲染开发者所需要的组件.比如现在有 ...
- 开源一个动态解析protobuf的工具
好久没写博客了,主要是这一年技术没啥长进都打杂了,还有就是生活琐事越来越多,人也越来越懒了…… 之前项目中用到了Protobuf,然后测试发现这玩意不好测,总不能每次定个协议或者改下都要编译Java代 ...
- Protobuf动态解析那些事儿
需求背景 在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做反序列化.“自动”的意思主要有两个方面:(1)当程序中新增一个 protobuf Mes ...
- jsoncpp动态解析节点类型
在互联网无处不在的今天,JSON作为轻量级数据存储格式,被广泛应用到互联网数据传输中.众所周知,JSON由键/值对.对象.数组组成,其中键/值对的值包括以下几种类型: enum ValueType { ...
随机推荐
- golang 中 sync.Mutex 的实现
mutex 的实现思想 mutex 主要有两个 method: Lock() 和 Unlock() Lock() 可以通过一个 CAS 操作来实现 func (m *Mutex) Lock() { f ...
- 时间篇之centos6下修复的ntp操作(ntpd和ntpdate两个服务区别)
系统采样,本采样和命令都是在centos6.4的系统中进行 主要比较centos7和centos6之间的差异,因为大部分都开始采用centos7但是有些老系统还采用centos6,这样我们就需要熟悉c ...
- CentOS7.x 离线安装和开机启动 supervisor 4.2.4
CentOS7.x 服务器 离线安装 开机启动 supervisor 4.2.4
- Spring Boot 使用 Redis 共享 Session 代码示例
参考资料 博客:spring boot + redis 实现session共享 1. 新建 Maven 工程 我新建 spring-boot-session-redis maven 工程 2. 引入 ...
- float,short类型赋值运算问题
float f = 3.4; 有错吗? 有错,因为浮点类型默认是double类型,double类型赋值给float类型是大类型赋值给小类型需要进行强转,可在3.4前加(float)进行强转,或者在声明 ...
- 数据库基础知识详解三:MVCC、范式以及表连接方式
写在文章前:本系列文章用于博主自己归纳复习一些基础知识,同时也分享给可能需要的人,因为水平有限,肯定存在诸多不足以及技术性错误,请大佬们及时指正. 8.MVCC 多版本并发控制(Multi-Versi ...
- 2021.08.16 P1260 工程规划(差分约束)
2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...
- Persistent Bits - 题解【二进制】
题面: WhatNext Software creates sequence generators that they hope will produce fairly random sequence ...
- JavaScript函数中的arguments对象
ECMAScript标准中,每个函数都有一个特殊的内置对象arguments.arguments对象是一个类Array对象(object),用以保存函数接收到的实参副本. 一.内置特性 说它是一个内置 ...
- python学习-Day24
目录 今日内容详细 主菜 : ATM+购物车作业 项目开发流程 需求分析 架构设计 分组开发 项目测试 交付上线 需求分析 提炼项目功能 项目大致技术栈 架构设计 编程历经过程 三层架构 将ATM分为 ...