表达式的动态解析和计算,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包即可。

c9c6d5e4feee7db148dbb61bb7a12c1c.png
2.1 超级简单案例

代码中有具体的注释,这里就不再详细说步骤了,截图如下:

0c291e28d0ec318689877c06e54bee0e.png

这种简单表达式内容都已经确定,全是可以计算的,没有变量。

应用场景1:表达式固定,直接通过对应的值拼接计算的场景。

应用场景2:表达式不固定,但是公式维护时针对一些变量值用特殊字符标记,然后通过正则表达式的形式找到标记的变量,并替换为对应的业务字段值。

如:[a]+[b]+3.14,这种情况是可以通过正则表达式将中括号标记的变量找出来的,然后根据对应的中间变量的名字替换对应的值就可以计算了。

2.2 带变量的表达式

代码中有具体的注释,这里就不再详细说步骤了,截图如下:

5a3986d05aa6e165c252152485aff729.png

这种带变量的形式就相对比较灵活,可以任意配置,只需在计算的时候将对应的变量附上值即可。有小伙伴可能会有疑问,变量不确定咋整啊,其实在实际应用场景中,很多时候需要传入的那些变量应该都知道,只是照着公式的规则动态传值即可。

应用场景:和简单案例中的不太一样,不需要特殊标记变量,这里直接正常维护公式正常传值即可。这种情况相对灵活,可以针对相关业务配置对应的公式,最后传对应的变量进行计算,最后根据算出的值进行相关业务处理即可。

2.3 表达式组合

CalculationEngine 可以将表达式进行组合计算,计算引擎会使用引擎内部其他表达式的结果、依赖关系,然后按顺序进行计算出组合之后的结果

6b4152914075ed0cef28f68d0dd7b935.png

应用场景:这种情况一般用于有多个表达式的场景,就类似于Excel中多个单元格中的表达式一样,每个单元格中都有表达式,然后有一个单元格就会引用其他单元格中的表达式计算出来的值,最后得出结果。

2.4 扩展函数

有时候在项目中会将计算逻辑进行封装,只需要传入需要值即可,不需要每个调用者还得重新进行编写相关的计算逻辑,Flee也支持在表达式中组合使用自定义的函数,演示如下:

先在一个类中写好相关的方法,这里的方法一定要是静态的、公共的,如下:

a797bb7f657482ad4b61835da489c167.png

然后就可以在表达式中用了,如下:

312758dd5285d1266c6b4e7f7a7548cf.png
2.5 支持可变参数的函数

和上面使用方式一样,自定义一个方法,只是这个方法的参数是不确定,可变的,如下:

280b385c115c71d079b19ede68b936bb.png

在表达式中使用:

6df68e11ce86d7f37a863b66ade85e00.png
2.6 返回值是Boolean类型的表达式

在实际应用场景中,有些时候只需要得到一个是否的结果,可能不需要计算一个具体的值;

ea91fe4177b0f6364ca6690623691d44.png

应用场景:这种情况一般用于一些自动判定规则的需求,比如有一些报表的结果在不同的业务类型时会有一个值的范围,如果超出范围就代表不合规,靠人为判断的话可能就没那么高效;类似这种对比数据的情况,如果只是简单的比对还容易实现,如果是复杂一点的关系比对,这种方式就相对灵活了。

好了,使用方式就暂时说到这,文中图片已经包含所有的代码。稍后我也会把代码提交github上和码云上。

总结

上文只是列举了一些简单的使用实例,具体小伙伴们可以根据业务场景进行使用。小伙伴们如果有更好的工具库,欢迎大家留言,一起学习。

关注“Code综艺圈”,和我一起学习吧。

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

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

相关文章

C语言九十五之实现经典的反转数组(通过指针或数组下标操作)

✅作者简介:大家好我是码玛莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转…

Linux下使用shell实现上传linux下某个目录下所有文件到ftp

首先我们需要搞清楚单个文件怎么上传,把这个单文件上传到ftp上的实现命名为一个:upload_to_ftp_command.sh 之后,需要弄清楚怎么实现遍历一个目录下的所有文件的,把这个遍历某个目录下的文件实现命名为:foeach_directory_and_uplo…

【地理信息系统GIS】教案(七章全)第二章:地理信息系统数据结构及数据获取

文章目录 第一节 地理空间及其表达第二节 空间数据采集第三节 属性数据采集第四节 空间数据格式转换第五节 空间数据质量第一节 地理空间及其表达 1.1 地理空间 地理空间上至大气电离层,下至地幔莫霍面,是生命过程活跃的场所,也是宇宙过程对地球影响最大的区域。 地理信息…

[转]Mysql数据库开发的36条原则

前言 这些原则都是经历过实战总结而成 每一条原则背后都是血淋淋的教训 这些原则主要是针对数据库开发人员,在开发过程中务必注意 总是在灾难发生后,才想起容灾的重要性; 总是在吃过亏以后,才记得曾有人提醒过。 一、核心原则…

Kamp;R练习题6-1统计关键词出现的次数

这道练习题训练了: 1.结构体数组 2.二分查找 3.指针操作 ---- 都不难。但非常基础,我认为非常好,做完了记到博客上来,题目见k&R,实现例如以下: /** Practice of struct array. K&R 6-1* author : w…

大话领域驱动设计——表示层及其他

概述表示层又称用户界面层,包含应用程序的页面、组件等UI元素。服务层提供项目的HTTP API接口,包含MVC Controller和相关组件。ABP框架虽然在表示层提供了不少组件,但是这些和DDD本身没有多少关系。而且随着前后端分离架构的流行,…

C语言九十六之实现经典的字符串反转(通过指针或下标操作)

✅作者简介:大家好我是码莎拉蒂,CSDN博客专家🥇🥇🥇 📃个人主页:个人主页 🔥系列专栏:C语言试题200例 💬推荐一款模拟面试、刷题神器👉 点击跳转进…

Windows10家庭中文版没有本地策略选项完美解决方案

Win+R,在运行中输入:secpol.msc,查看安全设置是否打开,如下图所示。 组策略对于优化和维护Windows系统来说十分重要。众所周知,Windows 10家庭版中并不包含组策略,对于使用家庭版Windows的朋友来说,十分不方便。 通常情况下,如果策略组没有打开的话,在安装CAD等软件时…

JavaScript总结(六)

使用DOM操纵样式表 ✍ 操纵元素的Style样式属性(所有的均对于CSS的内联式) 对于每个CSS样式,Style对象都包含了一个相对应的属性,只需要用到style属性即可; Div.style.color "red"; //给div元素设置字体颜色…

[转]浅谈CMD和win powershell的区别

1、前言:本文给大家简单描述了一下POWERSHELL和CMD的区别,简单的说,Powershell是cmd的超集,换句话说,cmd能做的事情,Powershell都能做,但是Powershell还能额外做许多cmd不能做的活。 2、cmd是和…

【ArcGIS风暴】栅格计算器(Raster Calculator)运算出现错误问题及解决方案汇总

栅格计算器(Raster Calculator) 是一种空间分析函数工具,可以输入地图代数表达式,使用运算符和函数来做数学计算,建立选择查询,或键入地图代数语法。只有熟练的运用并记忆一些常用的公式,才能很好的运用栅格计算器。在使用的过程中,容易出现这样那样的问题,本文就把栅…

「博客之星」评选,互投5星,留链必投

⭐⭐ ⭐ ⭐⭐ 欢迎诚信互投⭐ ⭐ ⭐ ⭐⭐ ⭐⭐⭐⭐⭐ 谢谢各位大佬门,互投5星⭐⭐⭐⭐⭐ 投票地址: https://bbs.csdn.net/topics/603958492 投票地址: https://bbs.csdn.net/topics/603958492 投票地址: https://bbs.csdn.net…

为 ServiceCollection 实现装饰器模式

为 ServiceCollection 实现装饰器模式Intro在二十四种设计模式中,有一个模式叫做装饰器模式一般用来动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活,有更好的扩展性,我们也可以借助 D…

手把手教你启用Win10的Linux子系统 Ubuntu

1、打开“开发者选项” 2、启用“执行 Linux 程序的windows 子系统” 3、应用商店下载安装Ubuntu 附:ubuntu的一些命令及查看已安装软件包的命令 // 系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat…

jquery的height()和javascript的height总结,js获取屏幕高度

jquery的height()和javascript的height总结,js获取屏幕高度在javascript和jquery中,都有对各种高度的写法,在这里,我们就着重讲一下窗口、文档等高度的理解。(宽度和高度差不多!)jquery的各种高度首先来说一说$(docume…

【地理信息系统GIS】教案(七章全)第五章:空间数据查询与空间分析

目录 第一节 空间数据查询第二节 缓冲区分析第三节 叠置分析第四节 网络分析第五节 DEM建立及分析第一节 空间数据查询 1.1 空间数据查询 1、空间数据查询的含义 从空间数据库中找出所有满足属性约束条件和空间约束条件的地理对象。 空间数据查询的一般过程 2、空间数据查询…

Understanding G1 GC Logs--转载

原文地址:https://blogs.oracle.com/poonam/entry/understanding_g1_gc_logs Understanding G1 GC Logs By Poonam-Oracle on Jun 18, 2012 The purpose of this post is to explain the meaning of GC logs generated with some tracing and diagnostic options fo…

Dart语言精简入门介绍

Dart语言精简入门介绍 1、介绍 Dart 在设计时应该是同时借鉴了 Java 和 JavaScript和kotlin 面向对象 JIT&AOT:JIT(Just in Time)优点:即时编译,开发期间更快编译,更快的重载;缺点&#…

WPF 窗口居中 变更触发机制

本文经原作者授权以原创方式二次分享,欢迎转载、分享。原文作者:唐宋元明清原文地址:https://www.cnblogs.com/kybs0/p/7420767.html窗口居中 & 变更触发机制解决:1)单实例窗口,窗口每次隐藏后再显示时…

[转]5分钟实现Android中更换头像功能

5分钟实现Android中更换头像功能 写在前面: 更换头像这个功能在用户界面几乎是100%出现的。通过拍摄照片或者调用图库中的图片,并且进行剪裁,来进行头像的设置。 功能相关截图如下: 下面我们直接看看完整吧: public cl…