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

C# 添加以BinaryExpression作为参数的表达式,c#,expression-trees,C#,Expression Trees,如何使用表达式执行嵌套加法操作Expression.Lambda预期参数的类型为ParameterExpression,但我的一个参数是加法的结果,因此其类型为BinaryExpression。它们不是相互派生的,因此我无法强制转换它们,也无法找到任何方法将它们从BinaryExpression转换为ParameterExpression 例如: var left = Expression.Parameter(typeof(int)); var rightLeft = Expression.Pa

如何使用
表达式执行嵌套加法操作
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();

您可以只调用一次
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"
var inputType=typeof(int);
var left=表达式参数(inputType,“left”);
var rightleeft=Expression.Parameter(inputType,“rightleeft”);
var rightRight=Expression.Parameter(inputType,“rightRight”);
var multiply=Expression.multiply(右左、右右);
var add=表达式.add(左,乘);
var lambda=表达式.lambda(添加、左、右、左、右);
Console.WriteLine(lambda.ToString());//将打印“(左、右、左、右)=>(左+(右左*右右))”
var result=lambda.Compile().Invoke(1,2,3);
Console.WriteLine(结果);//将打印“7”

如果手工编写表达式,请提问并演示表达式应该是什么样子?如果我在编译时不知道有多少个参数,会发生什么情况?我实际上在构建一个相当大的表达式,我的示例可能太简单了。是否有一种方法可以在运行时动态指定
Lambda
?@FCin您可以使用ExpressionVisitor检查传入的表达式,并找出需要传递多少个参数。不过,如果您再次编辑您的问题,并添加您想要生成的内容的更具体示例,则会更好
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"