添加以 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"
如何使用 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"