C# - 我可以从用户提供的字符串公式中动态定义函数吗?

时间:2011-03-23 13:31:21

标签: c# .net reflection mathematical-expressions

我可以使用lambda表达式定义一个func,如:

Func <int, int, int> Fxy = ( (a,b) => a + b ) );  // Fxy does addition

但是如果我想让用户提供r.h.s.该怎么办?运行时的lambda表达式?

String formula_rhs = Console.Readline();
// user enters "a - b"

我可以以某种方式修改Fxy,就像我编码

一样
Func <int, int, int> Fxy = ( (a,b) => a - b ) );  // Fxy does what the user wants 
                                                  // (subtraction)

我目前使用自制的表达式解析器来接受用户定义的公式。刚刚开始使用.NET,我觉得可能有一种不太痛苦的方法来做到这一点。

5 个答案:

答案 0 :(得分:1)

尝试使用ncalc框架:http://ncalc.codeplex.com/ 它简单轻便。

答案 1 :(得分:0)

不是那么容易。 This library包含一些Dynamic Linq功能,您可以使用这些功能将lambda表达式从文本转换为Func&lt;&gt;,看看它。

答案 2 :(得分:0)

System.Reflection.Emit命名空间用于即时生成代码。它一般来说非常复杂,但可能有助于简单的功能,如减法。

答案 3 :(得分:0)

如果您打算使用非复杂的公式,JScript引擎将很容易解决:

        Microsoft.JScript.Vsa.VsaEngine engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
        MessageBox.Show(Microsoft.JScript.Eval.JScriptEvaluate("((2+3)*5)/2", engine).ToString());

别忘了添加对Microsoft.JScript汇编

的引用

答案 4 :(得分:0)

在这里使用Linq.Expressions可能是一个想法。

您的示例将转换为:

var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var sum = Expression.Subtract(a, b);
var lamb = Expression.Lambda<Func<int, int, int>>(sum, a, b);
Func<int, int, int> Fxy = lamb.Compile();

当然,您可以将字符串解析为正确的表达式。 : - )