我希望这里有一些善良的灵魂可以帮助我。基本上,我在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);
我遇到的问题是:
有没有一种方法可以声明,就像普通代码a = 4
和b = 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()();
但我想尽可能避免在功能中添加块段。
非常感谢任何帮助和指示
由于
答案 0 :(得分:1)
我不知道它有多少变量。
您拥有所有可能变量的列表。因此,我认为最简单的解决方案是始终假设使用所有变量。因此,您生成一个lambda,其中包含所有变量作为参数,然后在将值传递给所有参数时调用它。
我不知道变量的使用顺序
我不知道这有什么关系。声明函数和调用函数时参数的顺序必须匹配,但是你控制两者,这样就不会有问题。