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

我正在构建一个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 expressions = new List(); 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>(finalExpression).Compile()(); 

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

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

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

(并删除对expressions.Add(resultVariable);的调用