构建LINQ表达式树:如何在范围内获取变量

San*_*zen 27 .net c# linq lambda expression-trees

我正在构建一个LINQ表达式树,但它不会编译,因为据称局部变量$var1超出了范围:

变量''类型'System.Object'从范围''引用,但它没有定义

这是表达式树:

.Block() {
    $var1;
    .If ($n.Property1 == null) {
        .Block() {
            $var1 = null;
            .Return #Label1 { }
        }
    } .Else {
        .Default(System.Void)
    };
    $var1 = (System.Object)($n.Property1).Length;
    .Label
    .LabelTarget #Label1:;
    $var1
}
Run Code Online (Sandbox Code Playgroud)

以下代码负责构建树.它是更大的东西的一部分,因此我不希望它的目的从这个例子中完全清楚.

MemberExpression sourceExpression = ...;

List<Expression> expressions = new List<Expression>();
LabelTarget returnTarget = Expression.Label();
ParameterExpression resultVariable = Expression.Variable(typeof(object));

expressions.Add(resultVariable);

expressions.Add(
    Expression.IfThen(
        Expression.Equal(sourceExpression, Expression.Constant(null)),
        Expression.Block(
            Expression.Assign(resultVariable, Expression.Constant(null)),
            Expression.Return(returnTarget))));

expressions.Add(
    Expression.Assign(
        resultVariable,
        Expression.Convert(sourceExpression, typeof(object))));

expressions.Add(Expression.Label(returnTarget));
expressions.Add(resultVariable);

Expression finalExpression = Expression.Block(expressions);
object result = Expression.Lambda<Func<object>>(finalExpression).Compile()();
Run Code Online (Sandbox Code Playgroud)

所以问题是:如何将局部变量放入范围,以便表达式成功编译?

Jon*_*eet 43

你把它添加Expression.Variable到块中的"普通"表达式列表中 - 你应该使用指定变量的重载分别为块声明:

Expression finalExpression = Expression.Block(new[] { resultVariable },
                                              expressions);
Run Code Online (Sandbox Code Playgroud)

(并删除电话expressions.Add(resultVariable);)