使用值编译C#表达式

时间:2016-03-31 16:45:47

标签: c# expression-trees

我将两个表达式与Expression.And结合起来。如何用实际值编译这个新表达式?

swashbuckle

我在尝试使用值替换参数后尝试使用这样的方法

var expr1 = Expression.Equal(Expression.Parameter(typeof(int), "param1"), Expression.Parameter(typeof(int), "param2"));
var expr2 = Expression.Equal(Expression.Parameter(typeof(int), "param3"), Expression.Parameter(typeof(int), "param4"));
var finalExpression = Expression.And(expr1, expr2);

2 个答案:

答案 0 :(得分:2)

您需要将其编译为具有相同参数的lambda:

var lambda = Expression.Lambda<Func<int, int, int, int, bool>>(
    finalExpression, param1, ...).Compile();
lambda(1, 2, 3, 4);

请注意,您需要将表达式中使用的Expression.Parameter()个实例传递给Lambda()

答案 1 :(得分:1)

如果要用常量替换参数,可以使用ExpressionVisitor替换参数,用Expression.Constant替换参数的任何实例。然后,您可以将lambda编译为类型而不需要参数。或者,您可以构建一个涉及另一个lambda的lambda - 不是在PC上,而是Expression.InvokeExpression.Call - 基本上,它就像一个子调用。