考虑这段代码片段;如何计算表达式
int sum = 0;
sum = Expression.Evaluate("1+1");
其中sum的值= 2
我有,将计算值表达,但我想的是表达被编程建立然后评估造成的。我不知道我会处理什么类或命名空间。任何人都可以帮助我。
考虑这段代码片段;如何计算表达式
int sum = 0;
sum = Expression.Evaluate("1+1");
其中sum的值= 2
我有,将计算值表达,但我想的是表达被编程建立然后评估造成的。我不知道我会处理什么类或命名空间。任何人都可以帮助我。
你可以使用表达式树:
表达式树表示在一树状数据结构,其中 每个节点是一个表达式的代码,例如,一个方法调用或二进制 操作例如x yy。< y。
您可以编译和运行由表达式树表示的代码。
注意:这个问题可以用System.Reflection.Emit
得到解决,并直接与MSIL工作,但生成的代码是很难写和读。
有点浏览后,我建议你结帐回避率Codeplex上:Fast Lightweight Expression Evaluator:
回避率是一个表达式解析器和评估的.NET Framework。 它 允许你计算串表达式的值如在运行时 SQRT(A^2 + B^2)。它使用自定义编译器,强类型表达式语言和轻量级代码编译器将表达式 直接编译为IL。这意味着表达式评估非常快速高效。
我很久以前曾用过一次http://jint.codeplex.com/。但那仅仅是用于原型设计。 –
您可以使用lambdas或使用System.Linq.Expressions命名空间中的类以编程方式构建表达式树。
更多信息,请参见MSDN。
它是可扩展的,速度快(如拥有自己的高速缓存),使您能够提供自定义功能和通过处理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加载新功能的分支。
它还支持逻辑运算符,日期/时间的字符串,如果语句。
'我确实有一个计算值的表达式。这是否意味着您提供的代码片段按预期工作? '我希望以编程方式构建这个表达式'。你能提供一个例子,如输入和输出。 – Azodious
这个答案可能是你要找的东西:http://stackoverflow.com/a/53852/1106671 –
可能的重复[如何评估一个C#表达式动态?](http://stackoverflow.com/questions/53844 /如何-可以-I-评估-AC-尖锐表达-动态地)。投票结束重复。如果是家庭作业 - 标记你需要帮助的细节,否则它已经被覆盖。 –