如何在 ExpressionTree 中 return 值
How to return value in ExpressionTree
我正在尝试为表达式树做,并尝试让它 return 一个简单的 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()();
问题不在于从块中返回值(您做的是正确的),而是由于使用了错误的 Expression.Block
方法重载而导致变量超出范围。
像你的 result
这样的变量表达式必须使用一些带有 IEnumerable<ParameterExpression> variables
参数的重载传递给块表达式,例如
var block = Expression.Block(
new ParameterExpression[] { result },
//... (the rest of the sample code unchanged)
);
我正在尝试为表达式树做,并尝试让它 return 一个简单的 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()();
问题不在于从块中返回值(您做的是正确的),而是由于使用了错误的 Expression.Block
方法重载而导致变量超出范围。
像你的 result
这样的变量表达式必须使用一些带有 IEnumerable<ParameterExpression> variables
参数的重载传递给块表达式,例如
var block = Expression.Block(
new ParameterExpression[] { result },
//... (the rest of the sample code unchanged)
);