+ 目录介绍在进行项目开发的时候,刚好需要用到对字符串表达式进行求值的处理场景,因此寻找了几个符合要求的第三方组件LambdaParser、DynamicExpresso、Z.Expressions,它们各自功能有所不同,不过基本上都能满足要求。它们都可以根据相关的参数进行字符串表达式的求值,本篇随笔介绍它们三者的使用代码,以及总结其中的一些经验。 数学表达式求值应该是最常见的,一般我们在应用程序中如果需要计算,是需要对参数进行类型转换,然后在后台进行相应计算的。但是如果是计算一些符合的式子或者公式,特别是参数不一定的情况下,这个就比较麻烦。利用第三方组件,对表达式进行快速求值,可以满足我们很多实际项目上的需求,而且处理起来也很方便。 这几个第三方组件,它们的GitHub或官网地址: https://github.com/nreco/lambdaparser https://github.com/dynamicexpresso/DynamicExpresso 不过Z.Expressions是收费的,前两者都是免费的。 我使用字符串表达式进行求值的场景,主要就是想对一个SQL条件的表达式,转换为普通的字符串表达式,然后根据对象的参数值,进行求值处理,这几个表达式求值组件都支持这样的操作,为了更好演示它们的使用效果及代码,我们专门创建了一个案例代码进行测试验证,确认满足我的实际需求。 1、Z.Expressions.Eval 表达式解析Z.Expression.Eval是一个免费开源的(后续收费了),可扩展的,超轻量级的公式化语言解析执行工具包,可以在运行时解析C#表达式的开源免费组件。Z.Expressions从2.0开始支持了NetCore,但是收费的。参考地址:https:///eval-expression/learn/100000/getting-started 或者 https:///eval-execute。 在运行时解析C#表达式,例如一些工资或者成本核算系统,就需要在后台动态配置计算表达式,从而进行计算求值。 下面对几个不同的案例代码进行介绍及输出结果验证 匿名类型处理
指定参数
类对象
字典对象
委托类型
字符串扩展支持
可以看出,该组件提供了非常丰富的表达式运算求值处理方式。 2、NReco.LambdaParser 表达式解析我看中这个组件的处理,主要是因为它能够传入参数是字典类型,这样我可以非常方便的传入各种类型的参数,并且这个组件比较接近SQL语法,可以设置利用常规的=代替表达式的==,这样对于SQL语句来说是方便的。 它的案例代码如下所示。
同样它支持的算术符号操作有:+, -, *, /, %,以及常规的逻辑判断:==, !=, >, <, >=, <=,如果需要它允许把=作为==比较,那么设置属性 AllowSingleEqualSign = true 即可,如下代码。
该组件没有过多提供例子,不过它的例子提供的关键点,基本上都能实现我们实际的表达式求值处理要求了。 3、DynamicExpresso 表达式解析相对于LambdaParser的简洁、Z.Expressions收费处理,Dynamic Expresso 可以说是提供了一个非常强大的、免费开源的处理类库,它提供非常多的表达式求值的实现方式。 简单的字符串表达式求值如下代码
但是一般我们需要传入一定的参数进行表达式求值的。
或者
或者赋值指定的参数
对于字典类型的处理,是我喜欢的方式,它的案例代码如下所示。
对于类的属性表达式查询,测试代码如下所示
4、SQL条件语句的正则表达式和字符串求值处理前面介绍了几个表达式求值处理的组件,他们基本上都能够满足实际的求值处理,只是提供的功能有所侧重。 我主要希望用它来对特定的表达式进行求布尔值,判断表达式是否满足条件的。 例如对于sql条件语句:(Amount> 500 and Title ='Leader') or Age> 32, 以及一个字典对象的参数集合,我希望能够提取里面的Amount、Title、Leader、Age这样的键,然后给字典赋值,从而判断表达式的值。 由于sql表达式和C#代码的表达式逻辑语法有所差异,我们需要替换and Or 为实际的&& || 字符,因此给定替换的正则表达式:\sand|\sor 而我需要先提取条件语句的键值内容,然后获得指定的键参数,那么也要提供一个正则表达式:\w*[^>=<!'()\s] ,这个正则表达式主要就是提取特定的字符匹配。 提取内容的C#代码逻辑如下所示。
表达式处理结果如下所示 它的逻辑代码如下。
这样我们就可以转换SQL条件表达式为实际的C#表达式,并通过赋值参数,实现动态表达式的求值处理。 到此这篇关于C#使用第三方组件实现动态解析和求值字符串表达式的文章就介绍到这了,更多相关C#解析 求值字符串表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! |
|