Создание дерева выражений LINQ: как стать переменным в объеме

Я создаю дерево выражений LINQ, но оно не скомпилирует потому что предположительно локальная переменная $var1 вне объема:

переменная ''типа 'Система. Объект' сослался от объема'', но он не определяется

Это - дерево выражений:

.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
}

Следующий код ответственен за создание дерева. Это - часть чего-то большего, поэтому я не ожидаю его цели быть совершенно ясным из этого примера.

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()();

Таким образом, вопрос: как я получаю локальную переменную в объем так, чтобы выражение скомпилировало успешно?

27
задан Sandor Drieënhuizen 30 July 2010 в 11:54
поделиться

1 ответ

Вы добавляете Выражение. Variable в список "обычных" выражений в блоке - вам следует использовать перегрузку, которая определяет переменные, объявляемые для блока отдельно:

Expression finalExpression = Expression.Block(new[] { resultVariable },
                                              expressions);

(И убрать вызов expressions.Add(resultVariable);)

.
43
ответ дан 28 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: