2

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

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

但是,如果我想让用户在运行时提供 lambda 表达式的 rhs 怎么办?

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)

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

4

5 回答 5

1

试试 ncalc 框架:http ://ncalc.codeplex.com/ 它简单轻量。

于 2011-03-23T13:38:35.693 回答
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程序集的引用

于 2011-03-28T07:08:20.253 回答
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();

当然,您将享受将字符串解析为正确表达式的乐趣。:-)

于 2011-03-28T07:43:57.347 回答
0

不是那么容易。这个库包含一些动态 Linq 功能,您可以使用这些功能将 lambda 表达式从文本转换为 Func<>,看看它。

于 2011-03-23T13:37:06.807 回答
0

System.Reflection.Emit 命名空间用于动态生成代码。它通常非常复杂,但可能有助于减法等简单功能。

于 2011-03-28T06:35:48.280 回答