Я строю дерево выражений 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
}
Следующий код отвечает за построение дерева. Это часть чего-то большего, поэтому я не ожидаю, что его цель будет совершенно ясна из этого примера.
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()();
Итак, вопрос в том, как мне поместить локальную переменную в область видимости, чтобы выражение успешно компилировалось?