Как вернуть значение в ExpressionTree - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать дерево выражений и дать ему возможность вернуть простое значение типа 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 голосов
/ 08 января 2019

Проблема не в возврате vaue из блока (вы делаете это правильно), а в том, что переменная находится вне области действия из-за неправильной перегрузки метода Expression.Block.

Выражения переменных, подобные вашему result, должны быть переданы в выражение блока с использованием некоторых перегрузок с аргументом IEnumerable<ParameterExpression> variables, например

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