在文章:这些.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;

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

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

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

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提供了这种非常给力的操作,将你的实例进行注册后,在表达式中,可以直接使用注册的名称来访问实例的成员变量,然后参与表达式的计算。这样,很多复杂的动态计算功能基本都可以实现了。

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

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类型的代码如下,很简单:

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

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

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

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

public class MyClass2
{public string[] myExternalString;public int x;
}

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

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

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

  1. .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践

    晚上浏览博客园 看到一篇非常实用的博客:.NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper,花了10分钟简单了解了一下. 看评论也是挺有价值,同时也看到许多新手同学问道在实际项目 ...

  2. .NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用

    原文:.NET平台开源项目速览(9)软件序列号生成组件SoftwareProtector介绍与使用 在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了 ...

  3. .NET平台开源项目速览(2)Compare .NET Objects对象比较组件

    原文:.NET平台开源项目速览(2)Compare .NET Objects对象比较组件 .NET平台开源项目速览今天介绍一款小巧强大的对象比较组件.可以更详细的获取2个对象的差别,并记录具体差别,比 ...

  4. .NET平台开源项目速览(1)SharpConfig配置文件读写组件

    原文:.NET平台开源项目速览(1)SharpConfig配置文件读写组件 在.NET平台日常开发中,读取配置文件是一个很常见的需求.以前都是使用System.Configuration.Config ...

  5. .NET平台开源项目速览(17)FluentConsole让你的控制台酷起来

    从该系列的第一篇文章 .NET平台开源项目速览(1)SharpConfig配置文件读写组件 开始,不知不觉已经到第17篇了.每一次我们都是介绍一个小巧甚至微不足道的.NET平台的开源软件,或者学习,或 ...

  6. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)

    阅读目录 1.KwCombinatorics基本介绍 2.足球彩票排列组合应用 3.排列组合生成代码与测试 今年上半年,我在KwCombinatorics系列文章中,重点介绍了KwCombinator ...

  7. .NET平台开源项目速览(4).NET文档生成工具ADB及使用

    .NET平台开源项目速览(4).NET文档生成工具ADB及使用 原文:.NET平台开源项目速览(4).NET文档生成工具ADB及使用 很久以前就使用ADB这个工具来生成项目的帮助文档.功能强大,在学习 ...

  8. .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB

    今天给大家介绍一个不错的小巧轻量级的NoSQL文件数据库LiteDB.本博客在2013年也介绍过2款.NET平台的开源数据库: 1.[原创]开源.NET下的XML数据库介绍及入门 2.[原创]C#开源 ...

  9. .NET平台开源项目速览(12)哈希算法集合类库HashLib

    阅读目录 1.哈希算法介绍 2.HashLib功能介绍 .NET的System.Security.Cryptography命名空间本身是提供加密服务,散列函数,对称与非对称加密算法等功能.实际上,大部 ...

最新文章

  1. pandas使用read_csv函数读取文件最后N行数据并保留表头、pandas使用read_csv函数读取网络url链接数据
  2. PaddleOCR,一款文本识别效果不输于商用的Python库!
  3. 数据库的同步和复制----sql语句方法
  4. 深入Java核心 Java内存分配原理精讲(3)
  5. 哪个类型的B端产品经理有前景?
  6. docker随着主机启动 自动启动设置
  7. android里R.layout.的问题
  8. 使用Bootstrap后,关于IE与Chrome显示字体的问题
  9. iPhone SDK开发基础之iPhone程序框架
  10. CREELINKS平台_处理器CeAd资源使用说明(CeAd的配置与使用)
  11. Tensorflow 报错:tensorflow.python.framework.errors_impl.InternalError: Failed to create session....
  12. [cocos2dx]斗地主随机发牌界面生成
  13. Linux——驱动开发
  14. ActivityGroup的简单用法
  15. SpringSecurity下做POST测试以及传递实体
  16. 在密码输入框内按回车就登陆的功能
  17. Linux ARM平台开发系列讲解(网络篇)1.2 MDIO总线驱动框架分析
  18. UE4 蓝图教程(三) 材质
  19. wpa_supplicant 的使用
  20. Charles抓包工具的安装操作以及可能出现的问题(安装不了证书、手机不能上网)

热门文章

  1. 分治、动态规划、贪婪 之 算法分析
  2. global 和 nonlocal关键字
  3. 认识Web前端、Web后端、桌面app和移动app新开发模式 - 基于Node.js环境和VS Code工具...
  4. CSS清除浮动_清除float浮动
  5. MVC模式与三层架构的区别
  6. JMeter Sampler之BeanShellSampler的使用
  7. 10.05 最初对Linux的了解,对Shell的认识
  8. 用Jsp来实现文件下载功能的几种方式
  9. LayerDate渲染多个class出现闪现问题的解决
  10. 解决spring-security session超时 Ajax 请求没有重定向的问题