如何为表达式树参数指定值并进行评估

时间:2016-02-08 23:31:41

标签: c# expression-trees

我希望这里有一些善良的灵魂可以帮助我。基本上,我在C#中有一个表示为表达式树的随机函数。我希望它由变量组成,并且我能够根据我分配变量的值来评估它。因此,在最简单的形式中,树可能看起来像:

ParameterExpression a = Expression.Variable(typeof(double), "a");
ParameterExpression b = Expression.Variable(typeof(double), "b");
Expression function = Expression.MakeBinary(ExpressionType.Subtract, a, b);

使函数看起来像(a - b)。然后,我希望对此进行评估,我可以这样做:

Expression.Lambda<Func<double, double, double>>(function, a, b).Compile()(5.0, 3.0);

我遇到的问题是:

  1. 该函数是随机生成的,所以我不知道它有多少变量。我只有一个可能的变量列表
  2. 我不知道变量的使用顺序
  3. 有没有一种方法可以声明,就像普通代码a = 4b = 2一样,然后根据这些声明编译函数?

    如果没有,那么还有其他选择吗?到目前为止,我有:

    • 在树中循环(使用ExpressionVisitor)并替换,仅用a说明Expression.Constant(4.0)
    • 走下路线:

      ParameterExpression variableExpr = Expression.Variable(typeof(double), "a");
      Expression assignExpr = Expression.Assign(variableExpr,Expression.Constant(4.0));
      Expression a = Expression.Block(new ParameterExpression[] { variableExpr }, assignExpr);
      [...]
      Expression.Lambda<Func<double>>(function).Compile()();
      

      但我想尽可能避免在功能中添加块段。

    非常感谢任何帮助和指示

    由于

1 个答案:

答案 0 :(得分:1)

  

我不知道它有多少变量。

您拥有所有可能变量的列表。因此,我认为最简单的解决方案是始终假设使用所有变量。因此,您生成一个lambda,其中包含所有变量作为参数,然后在将值传递给所有参数时调用它。

  

我不知道变量的使用顺序

我不知道这有什么关系。声明函数和调用函数时参数的顺序必须匹配,但是你控制两者,这样就不会有问题。