C# 动态解析表达式

简介:

需求

我们很难捉摸用户的思维,即使使用非常正式的文档规范某些数据的定义、结果的标准等,也不能抵挡住用户不断变化的需求,但他们有个万变不离的东西——你做这个东西要是万能的,即输入参数类型、个数等发生改变,也得生成出正确的结果。

在编程计算中,很多时候涉及一些公式,用户要求不但能够调整系数、还要能够调整理公式的结构。例如,将2+3-5调整理成2+3*5。我之前使用的解决方案是写一个类,换公式了,就继承它,写一个子类,代码中用反射去调用这个子类,可以解决问题。但是有些麻烦。

解决方案

现决定,用动态来解析公式的方法来解决这个问题。由于时间比较紧张,找到了一个开源的类库ExpressionEvaluator,没有深入研究,不过已经解决了我们的问题。

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

使用示例

1.在官网下载ExpressionEvaluator. dll(2.0.4版),在网上搜索antlr3.runtime.dll(3.5.0.2版)

2.项目中引用这两个dll;

3.第一种情况,不需要变量,直接是常规的数字、符号、系统函数(Math类)的组合。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// 简单数值计算
/// </summary>
/// <param name="str">纯表达式</param>
/// <returns>返回值</returns>
public  static  string  SimpleEval( string  str)
{
     var  types =  new  TypeRegistry();
     types.RegisterDefaultTypes();
 
     var  expression =  new  CompiledExpression(str) { TypeRegistry = types };
     var  result = expression.Eval();
     Console.WriteLine( "简单数值计算: {0}" , result);
     return  result.ToString();
}

  

调用:

1
SimpleEval( this .textBox1.Text.Trim()

  

结果如下:

4.第二种情况,其中包含了一些变量(这种情况更多),需要将自己的变量写成一个类,然后注册这个类。

1
2
3
4
5
public  class  Result
{
     public   double  Death {  get set ; }
     public   double  Injury {  get set ; }
}

  

方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// 变量字段的计算
/// </summary>
/// <param name="str"></param>
/// <param name="type"></param>
/// <returns></returns>
public  static  string  FieldEval( string  str,Object type)
{
     //注册
     var  reg =  new  TypeRegistry();
     reg.RegisterSymbol( "Result" , type);
     //如果要使用Math函数,还就注册这个
     //reg.RegisterDefaultTypes();
 
     //编译
     var  p =  new  CompiledExpression(str) { TypeRegistry = reg };
     p.Compile();
 
     //计算
     Console.WriteLine( "变量字段计算: {0}" , p.Eval());
     return  p.Eval().ToString();
}

  

调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
string [] strFields =  new  string [] {  "Death" , "Injury" };
string  exp =  this .textBox2.Text.Trim();
for  ( int  i = 0; i < strFields.Length;i++ )
{
     if  (exp.Contains(strFields[i]))
     {
         exp= exp.Replace(strFields[i],  "Result."  + strFields[i]);
     }
                 
                 
}
Result re =  new  Result()
{
         Death = Convert.ToDouble( this .txtDeath.Text.Trim() +  "" ),
         Injury = Convert.ToDouble( this .txtInjury.Text.Trim() +  "" )
};
 
ExpEvaluator.FieldEval(exp,re)

  

结果:

当然,还有其他内容需要研究、学习!

参考

Github地址:

https://github.com/RupertAvery/csharpeval

调用系统的Math函数:

http://csharpeval.codeplex.com/discussions/585878









本文转自我也是个傻瓜51CTO博客,原文链接: http://www.cnblogs.com/liweis/p/6703314.html,如需转载请自行联系原作者





相关文章
|
存储 算法 安全
如何控制上网行为——基于 C# 实现布隆过滤器算法的上网行为管控策略研究与实践解析
在数字化办公生态系统中,企业对员工网络行为的精细化管理已成为保障网络安全、提升组织效能的核心命题。如何在有效防范恶意网站访问、数据泄露风险的同时,避免过度管控对正常业务运作的负面影响,构成了企业网络安全领域的重要研究方向。在此背景下,数据结构与算法作为底层技术支撑,其重要性愈发凸显。本文将以布隆过滤器算法为研究对象,基于 C# 编程语言开展理论分析与工程实践,系统探讨该算法在企业上网行为管理中的应用范式。
329 8
|
存储 监控 算法
解析公司屏幕监控软件中 C# 字典算法的数据管理效能与优化策略
数字化办公的时代背景下,企业为维护信息安全并提升管理效能,公司屏幕监控软件的应用日益普及。此软件犹如企业网络的 “数字卫士”,持续记录员工电脑屏幕的操作动态。然而,伴随数据量的持续增长,如何高效管理这些监控数据成为关键议题。C# 中的字典(Dictionary)数据结构,以其独特的键值对存储模式和高效的操作性能,为公司屏幕监控软件的数据管理提供了有力支持。下文将深入探究其原理与应用。
362 4
|
机器学习/深度学习 监控 算法
员工上网行为监控软件中基于滑动窗口的C#流量统计算法解析​
在数字化办公环境中,员工上网行为监控软件需要高效处理海量网络请求数据,同时实时识别异常行为(如高频访问非工作网站)。传统的时间序列统计方法因计算复杂度过高,难以满足低延迟需求。本文将介绍一种基于滑动窗口的C#统计算法,通过动态时间窗口管理,实现高效的行为模式分析与流量计数。
369 2
|
9月前
|
XML 前端开发 C#
C#编程实践:解析HTML文档并执行元素匹配
通过上述步骤,可以在C#中有效地解析HTML文档并执行元素匹配。HtmlAgilityPack提供了一个强大而灵活的工具集,可以处理各种HTML解析任务。
387 19
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
这篇文章提供了Visual Studio 2022社区版C#环境的搭建和安装使用指南,包括下载、安装步骤和创建C#窗体应用程序的详细图文解析。
visual studio 2022 社区版 c# 环境搭建及安装使用【图文解析-小白版】
|
监控 算法 安全
基于 C# 的内网行为管理软件入侵检测算法解析
当下数字化办公环境中,内网行为管理软件已成为企业维护网络安全、提高办公效率的关键工具。它宛如一位恪尽职守的网络守护者,持续监控内网中的各类活动,以确保数据安全及网络稳定。在其诸多功能实现的背后,先进的数据结构与算法发挥着至关重要的作用。本文将深入探究一种应用于内网行为管理软件的 C# 算法 —— 基于二叉搜索树的入侵检测算法,并借助具体代码例程予以解析。
233 4
|
自然语言处理 算法 Python
再谈递归下降解析器:构建一个简单的算术表达式解析器
本文介绍了递归下降解析器的原理与实现,重点讲解了如何使用Python构建一个简单的算术表达式解析器。通过定义文法、实现词法分析器和解析器类,最终实现了对基本算术表达式的解析与计算功能。
499 52
|
编译器 C# 开发者
C# 9.0 新特性解析
C# 9.0 是微软在2020年11月随.NET 5.0发布的重大更新,带来了一系列新特性和改进,如记录类型、初始化器增强、顶级语句、模式匹配增强、目标类型的新表达式、属性模式和空值处理操作符等,旨在提升开发效率和代码可读性。本文将详细介绍这些新特性,并提供代码示例和常见问题解答。
446 7
C# 9.0 新特性解析
|
存储 监控 算法
企业内网监控系统中基于哈希表的 C# 算法解析
在企业内网监控系统中,哈希表作为一种高效的数据结构,能够快速处理大量网络连接和用户操作记录,确保网络安全与效率。通过C#代码示例展示了如何使用哈希表存储和管理用户的登录时间、访问IP及操作行为等信息,实现快速的查找、插入和删除操作。哈希表的应用显著提升了系统的实时性和准确性,尽管存在哈希冲突等问题,但通过合理设计哈希函数和冲突解决策略,可以确保系统稳定运行,为企业提供有力的安全保障。
|
C# 开发者
C# 10.0 新特性解析
C# 10.0 在性能、可读性和开发效率方面进行了多项增强。本文介绍了文件范围的命名空间、记录结构体、只读结构体、局部函数的递归优化、改进的模式匹配和 lambda 表达式等新特性,并通过代码示例帮助理解这些特性。
352 2

推荐镜像

更多
  • DNS