如何在ExpressionTree中返回值

时间:2019-01-08 10:18:32

标签: c# expression-trees

我正在尝试为表达式树做操作,并尝试让它返回一个简单的int值。但它不再工作了

        var method = typeof(Console).GetMethod("WriteLine", new Type[] {typeof(string)});

        var result = Expression.Variable(typeof(int));



        var block = Expression.Block(
            result,
          Expression.Assign(result,Expression.Constant(0)),
            Expression.IfThenElse(Expression.Constant(true),
                Expression.Block(Expression.Call(null, method, Expression.Constant("True")),
                    Expression.Assign(result, Expression.Constant(1))),
                Expression.Block(Expression.Call(null, method, Expression.Constant("False")), Expression.Assign(
                    result, Expression.Constant(0)
                ))),
            result
        );


        Expression.Lambda<Func<int>>(block).Compile()();

1 个答案:

答案 0 :(得分:6)

问题不在于从块返回值(您做得正确),而是由于使用了错误的Expression.Block方法重载而导致超出范围的变量。

例如,像result这样的变量表达式必须使用某些带有IEnumerable<ParameterExpression> variables参数的重载传递给块表达式

    var block = Expression.Block(
        new ParameterExpression[] { result },
        //... (the rest of the sample code unchanged)
    );