添加以 BinaryExpression 作为参数的表达式

Add expression with BinaryExpression as parameter

如何使用 Expression 执行嵌套加法运算? Expression.Lambda<> 预期参数的类型为 ParameterExpression,但我的参数之一是加法的结果,因此其类型为 BinaryExpression。它们不是相互派生的,所以我无法转换它们,我也找不到任何方法将 BinaryExpression 转换为 ParameterExpression.

示例:

var left = Expression.Parameter(typeof(int));
var rightLeft = Expression.Parameter(typeof(int));
var rightRight = Expression.Parameter(typeof(int));
var right = Expression.Multiply(rightLeft, rightRight);

var add = Expression.Add(left, right);

var multiplyResult = Expression.Lambda<Func<int, int, int>>(right, rightLeft, rightRight).Compile()(5, 3);
var result = Expression.Lambda<Func<int, int, int>>(add, left, Expression.Parameter(typeof(int))).Compile();

最后一行抛出

System.InvalidOperationException: 'variable '' of type 'System.Int32' referenced from scope '', but it is not defined'

表达式应编译为:

var result = left + (rightLeft * rightRight);

您可以只调用一次Compile并在其他二进制表达式中引用乘法结果。试试这个代码:

var inputType = typeof(int);

var left = Expression.Parameter(inputType, "left");
var rightLeft = Expression.Parameter(inputType, "rightLeft");
var rightRight = Expression.Parameter(inputType, "rightRight");

var multiply = Expression.Multiply(rightLeft, rightRight);
var add = Expression.Add(left, multiply);

var lambda = Expression.Lambda<Func<int, int, int, int>>(add, left, rightLeft, rightRight);
Console.WriteLine(lambda.ToString()); // will print "(left, rightLeft, rightRight) => (left + (rightLeft * rightRight))"

var result = lambda.Compile().Invoke(1, 2, 3);

Console.WriteLine(result); // will print "7"