前言
在很多项目中经常会出现需要动态解析表达式和计算的场景,比如一些自动审核规则,或者是一些变量的值通过维护的公式在运行过程中动态算出;由于场景需求,都需要比较灵活的配置对应的表达式,然后希望在需要的时候能根据维护的表达式计算出对应的值;刚好这块和同事聊天的时候说到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上和码云上。
总结
上文只是列举了一些简单的使用实例,具体小伙伴们可以根据业务场景进行使用。