表达式的动态解析和计算,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 { ...
随机推荐
- IDEA-2020版本 Gradle项目控制台输出乱码
点击Help->Edit custom vm options 加入下面这一行 -Dfile.encoding=utf-8 最后当然要重启idea了
- equals 与 == 区别
1.对于==: 基本数据类型:byte,short,char,int,long,float,double,boolean. 基本数据类型之间的比较,对于==,比较的是他们存储的"值" ...
- Java学习day40
跟着视频回顾了整个JavaSE的学习过程
- Java学习day27
今天跟着做了一个模拟龟兔赛跑的程序 只有一条赛道,乌龟和兔子在同一条赛道上比赛,使用了多线程 为了实现兔子睡觉,在run方法内增加了当前奔跑者是否是兔子的判断且当前奔跑步数是否是10的整数倍的判断,如 ...
- 微信小程序 因文件大小不能使用本地背景图片解决方法
因微信文件只允许2m,所以不能给图片太多空间.所以出现背景图片的坑 解决方案1: 把背景图片放到服务器文件件下,直接将路径给url. 得是https开头的路径才可以 解决方案2:将图片转换成base6 ...
- 使用Camera API https://developer.mozilla.org/zh-CN/docs/Web/Guide/API/Camera
使用Camera API 在本文章中 获取到所拍摄照片的引用 在网页中展示图片 完整的示例代码 HTML页面: JavaScript文件: 浏览器兼容性 通过Camera API,你可以使用手机的摄像 ...
- Android四大组件——Activity——Activity的生命周期
Activity状态: 每个Activity在其生命周期中最多可能有四种状态 1.运行状态:处于栈顶时.初次创建处于栈顶时依次调用:onCreate(),onStart(),onResume().由不 ...
- Mozi.HttpEmbedded嵌入式Web服务器
Mozi.HttpEmbedded 嵌入式Web服务器 项目介绍 Mozi.HttpEmbedded是一个基于.Net构建的嵌入式Web服务器,为.Net App提供web服务功能. 嵌入式的目标不是 ...
- PostgreSQL 锁 之 关系级锁
1.关于锁的基本信息 PostgreSQL 有各种各样的技术来锁定某些东西(或者至少是这样称呼的).因此,我将首先用最笼统的术语解释为什么需要锁,可用的锁类型以及它们之间的区别.然后我们将弄清楚 Po ...
- C#中检查null的语法糖
今天看到已经更新了devblogs,新增的C# 11的!!(用于检查null的语法)经过非常长的讨论,最后取消了.然后我又想起来null检查,这个可以说一说. 函数参数null检查 传统写法 写一个函 ...