.NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

简介:

  在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件。那里只是概述了一下,并没有对其使用和强大功能做深入研究,所以今天就通过一篇简单的文章来预览一下其强大的功能。本文曾在【原创】.NET开源表达式计算组件介绍与使用一文中介绍过一个.NET平台开源的表达式计算组件NCal。不过经过比较还是这个Expression Evaluator比较强大,虽然部分功能有重叠。也都能计算常规的数学表达式。这个组件的功能应该说更加强大吧。同时上次的文章中,也有网友提到了另外一个在github的.NET平台的表达式计算组件DynamicExpresso

.NET开源目录:【目录】本博客其他.NET开源项目文章目录

本文原文地址:.NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用入门

1.基本功能介绍

    Expression Evaluator是一个轻量级的可以在运行时解析C#表达式的开源免费组件。表达式求值应该在很多地方使用,例如一些工资或者成本核算系统,就需要在后台动态配置计算表达式,从而进行计算求值。经过看源代码,这组件是用到了一个Antlr3的开源工具,Antlr3是一个开源的,支持多平台的语法解析器。该组件目前还在更新中,所以值得关注。Expression Evaluator支持的特性有:

*支持算术运算符,支持关系运算符,以及逻辑运算符

*支持表达式分组和括号,以及递增递减运算符

*支持表达式属性访问以及动态类型,支持字符串的+运算

*支持数值类型的后缀d/f/m/l/u/ul、

*支持隐式表达式,以及成员访问操作符(.)

*支持一些默认的类型,如double, float, char, string, DateTime, Convert, Math

*支持foreach循环

等等,更多功能还期待你的使用和发现。下面我们就将介绍该组件的几个典型表达式求值的用途。

官方网站:http://csharpeval.codeplex.com/ 

2.数学表达式求值

    数学表达式求值应该是最常见的,一般我们在应用程序中如果需要计算,是需要对参数进行类型转换,然后在后台进行相应计算的。但是如果是计算一些符合的式子或者公式,特别是参数不一定的情况下,这个就比较麻烦,虽然也有解决办好。但总归是不好。那看看使用 Expression Evaluator的几个简单例子。

    使用需要注意的是:需要直接引用ExpressionEvaluator.dll,另外Antlr3.Runtime.dll可以直接引用,也可以直接放到bin目录中,否则会提示找不到依赖文件。以前看到过一个表达式组件也是使用了这个开源的语法分析器。

    看看核心代码,使用前引用主要的命名空间:using ExpressionEvaluator;

1
2
3
var  expression =  new  CompiledExpression( "1 + 2 + 3 + 4 + 5" );
var  result = expression.Eval();
Console.WriteLine(result); //结果 15

    输出结果是 15,很明显就是2个过程,需要表达式,然后进行Eval分析计算即可。

    另外在使用组件时,内部还默认注册了很多.NET值类型,可以直接使用这些类型的静态方法来进行操作。例如可以进行如下解析并执行:

1
2
3
var  expression =  new  CompiledExpression( "double.Parse('3.141592654')" );
var  result = expression.Eval();
Console.WriteLine(result);   // 结果是:3.141592654

    是可以直接执行double的Parse方法的。目前内置支持的类型:

object/Object,bool/Boolean,byte/Byte,char/Char,short/Int16,int/Int32,long/Int64,ushort/UInt16,uint/UInt32,ulong/UInt64,decimal/Decimal

double/Double,float/Single,string/String

    至于布尔类型的判断等也都支持,比较简单,就不详细说了。

    下面就看看Expression Evaluator的其他用法。进行简单数值计算,其他很多组件都能办到。

3.注册类型与范围注册类型的成员

    在上面例子中,系统内部已经支持了一些数值类型,可以直接进行静态函数的调用解析。但是实际中,我们的业务系统类型肯定千变万化,要满足动态计算的情况,显然上面是不够的。所以Expression Evaluator提供了这种非常给力的操作,将你的实例进行注册后,在表达式中,可以直接使用注册的名称来访问实例的成员变量,然后参与表达式的计算。这样,很多复杂的动态计算功能基本都可以实现了。

    看看下面这个例子,具体过程不详细见解,我在注释中写全面一点,看代码就可以理解了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static  void  Test()
{
     var  v =  new  MyClass(); //对象实例化
     v.myExternalVar = 6; //字段赋值
     //TypeRegistry是核心的类型注册对象
     var  registry =  new  TypeRegistry();
     //将上面的变量v进行注册,以符号vars替代
     registry.RegisterSymbol( "vars" , v);
 
     //表达式计算对象,仔细看里面的变量vars以及直接调用myExternalVar字段
     var  exp =  new  CompiledExpression( "(vars.myExternalVar + 3) / 2 * 4.5 " );
 
     // 设置表达式的类型注册对象为 registry,注意要在eval之前进行设置
     exp.TypeRegistry = registry;
     Console.WriteLine(exp.Eval()); //结果20.25,看看怎么来的?
 
     //表达式计算对象,仔细看里面的变量vars以及直接调用myExternalVar字段
     var  exp2 =  new  CompiledExpression( "vars.getRandomNumber() + 3" );
 
     // 设置表达式的类型注册对象为 registry,注意要在eval之前进行设置
     exp2.TypeRegistry = registry;
     Console.WriteLine(exp2.Eval()); //结果为8,5+3
}

     上面的MyClass类型的代码如下,很简单:

1
2
3
4
5
6
7
8
9
10
11
/// <summary>自定义的实体或者业务类型</summary>
public  class  MyClass
{
     /// <summary>一个指定的double字段</summary>
     public  double  myExternalVar;
     //获取double值的一个方法
     public  double  getRandomNumber()
     {
         return  5; //假设默认返回5
     }
}

     下面再看一下通过字符串访问数组索引值的方法。

4.通过字符串动态访问数组下标

    和上面的例子有部分类似,开阔一下眼界吧,说明其使用是非常灵活的。为了便于演示,我们同样构造一个MyClass2类,代码如下:

1
2
3
4
5
public  class  MyClass2
{
     public  string [] myExternalString;
     public  int  x;
}

    下面是访问获取字符串数组的代码:

1
2
3
4
5
6
7
8
9
10
var  v =  new  MyClass2();
v.myExternalString =  new  string [] {  "Hello" "there" "World!"  };
v.x = 2;
var  registry =  new  TypeRegistry();
registry.RegisterSymbol( "v" , v);
 
var  exp =  new  CompiledExpression( "v.myExternalString[v.x/2]" );
exp.TypeRegistry = registry;
 
Console.WriteLine(exp.Eval()); //结果there

5.资源

    源代码大家可以去官网下载最新的,还是老样子,制作了一份CHM格式的帮助文档。如果打不开的同学,记得右键,属性,解除锁定哦。晒图:

下载地址:ExpressionEvaluator表达式计算帮助文档.rar


本文转自叶小钗 h数据之巅博客园博客,原文链接:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_Expression_Evaluator.html,如需转载请自行联系原作者


相关文章
|
27天前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
32 3
|
1月前
|
存储 设计模式 编解码
.NET 8.0 通用管理平台,支持模块化、WinForms 和 WPF
【11月更文挑战第5天】本文分析了.NET 8.0 通用管理平台在模块化、WinForms 和 WPF 方面的优势。模块化设计提升了系统的可维护性和可扩展性,提高了代码复用性;WinForms 提供了丰富的控件库和简单易用的开发模式,技术成熟稳定;WPF 支持强大的数据绑定和 MVVM 模式,具备丰富的图形和动画功能,以及灵活的布局系统。
|
2月前
.NET 4.0下实现.NET4.5的Task类相似功能组件
【10月更文挑战第29天】在.NET 4.0 环境下,可以使用 `BackgroundWorker` 类来实现类似于 .NET 4.5 中 `Task` 类的功能。`BackgroundWorker` 允许在后台执行耗时操作,同时不会阻塞用户界面线程,并支持进度报告和取消操作。尽管它有一些局限性,如复杂的事件处理模型和不灵活的任务管理方式,但在某些情况下仍能有效替代 `Task` 类。
|
4月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
77 0
|
5月前
|
存储 开发框架 前端开发
基于Lumisoft.NET组件,使用IMAP协议收取邮件
基于Lumisoft.NET组件,使用IMAP协议收取邮件
|
5月前
|
存储 对象存储 Python
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
`openpyxl`是一个用于读写Excel 2010 xlsx/xlsm/xltx/xltm文件的Python库。它不需要Microsoft Excel,也不需要.NET或COM组件。
|
XML .NET C#
推荐几个Net开源项目
SharpDevelop 强大的插件系统,通过Addin构建成一个功能齐全的.net开发IDE。核心是AddInTree。跟随这个项目开发许多有用的组件,比如功能文本编辑器(ICSharpCode.TextEditor),SharpZipLib等。
1057 0
|
3月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
46 7
|
3月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
74 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
55 0