如何计算表达式

本文关键字:表达式 计算 何计算 | 更新日期: 2023-09-27 18:21:16

考虑这个代码片段;

int sum = 0;
sum = Expression.Evaluate("1+1");

其中sum的值=2

我确实有一个计算值的表达式,但我希望该表达式是用程序构建的,然后计算结果。我不知道我将处理什么类或命名空间。任何人都可以帮助我。

如何计算表达式

您可以使用表达式树:

表达式树表示树状数据结构中的代码,其中每个节点都是一个表达式,例如,一个方法调用或一个二进制诸如x<y.

您可以编译和运行由表达式树表示的代码。

  • 表达式树(C#和Visual Basic)

  • 表达式树基础

注意:这个问题可以使用System.Reflection.Emit解决,并直接与MSIL一起工作,但生成的代码很难编写和读取。

浏览一番后,我建议您在Codeplex上结账:快速轻量级表达式计算器:

Flee是.NET框架的表达式解析器和计算器它允许您计算字符串表达式的值,例如sqrt(a^2+b^2)在运行时。它使用自定义编译器、强类型表达式语言和轻量级代码生成来编译表达式直接到IL。这意味着表达式评估是极其重要的快速高效。

您可以使用lambdas或使用System.Linq.Expressions命名空间中的类以编程方式构建表达式树。

有关详细信息,请参阅MSDN。

你看到了吗http://ncalc.codeplex.com?

它具有可扩展性和快速性(例如,有自己的缓存),使您能够通过处理EvaluateFunction/EEvaluateParameter事件在运行时提供自定义函数和可变值。它可以解析的示例表达式:

Expression e = new Expression("Round(Pow(Pi, 2) + Pow([Pi2], 2) + X, 2)");
  e.Parameters["Pi2"] = new Expression("Pi * Pi");
  e.Parameters["X"] = 10;
  e.EvaluateParameter += delegate(string name, ParameterArgs args)
    {
      if (name == "Pi")
      args.Result = 3.14;
    };
  Debug.Assert(117.07 == e.Evaluate());

它还处理unicode&许多数据类型都是原生的。如果你想更改语法,它会附带一个鹿角文件。还有一个fork支持MEF加载新功能。

它还支持逻辑运算符、日期/时间字符串和if语句。