2012-01-25 117 views
1

考虑这段代码片段;如何计算表达式

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

其中sum的值= 2

我有,将计算值表达,但我想的是表达被编程建立然后评估造成的。我不知道我会处理什么类或命名空间。任何人都可以帮助我。

+0

'我确实有一个计算值的表达式。这是否意味着您提供的代码片段按预期工作? '我希望以编程方式构建这个表达式'。你能提供一个例子,如输入和输出。 – Azodious

+0

这个答案可能是你要找的东西:http://stackoverflow.com/a/53852/1106671 –

+1

可能的重复[如何评估一个C#表达式动态?](http://stackoverflow.com/questions/53844 /如何-可以-I-评估-AC-尖锐表达-动态地)。投票结束重复。如果是家庭作业 - 标记你需要帮助的细节,否则它已经被覆盖。 –

回答

1

你可以使用表达式树:

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

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

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

有点浏览后,我建议你结帐回避率Codeplex上:Fast Lightweight Expression Evaluator

回避率是一个表达式解析器和评估的.NET Framework。 它 允许你计算串表达式的值如在运行时 SQRT(A^2 + B^2)。它使用自定义编译器,强类型表达式语言和轻量级代码编译器将表达式 直接编译为IL。这意味着表达式评估非常快速高效。

+0

我很久以前曾用过一次http://jint.codeplex.com/。但那仅仅是用于原型设计。 –

0

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

更多信息,请参见MSDN

0

你见过http://ncalc.codeplex.com

它是可扩展的,速度快(如拥有自己的高速缓存),使您能够提供自定义功能和通过处理EvaluateFunction/EvaluateParameter事件在运行时varaibles。示例表达式它可以解析:

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 &许多数据类型本身。如果您想更改语法,它会附带一个鹿角文件。还有一个支持MEF加载新功能的分支。

它还支持逻辑运算符,日期/时间的字符串,如果语句。