局部变量和表达式树我正在学习C#中的表达式树。我现在卡住了一段时间:stringfilterString="ruby";Expressionexpression=x=>x==filterString;如何通过代码构造此表达式?没有示例如何捕获局部变量。这个很简单:Expressionexpression=x=>x=="ruby";这将是:ParameterExpressionstringParam=Expression.Parameter(typeof(string),"x");表达式常量=Expression.Constant("ruby");BinaryExpressionequals=Expression.Equal(stringParam,constant);Expressionlambda1=Expression.Lambda(equals,newParameterExpression[]{stringParam});调试器是(x=>x==filterString)打印以下内容:{x=>(x==value(Predicate.Program+c__DisplayClass3).filterString)}感谢您对此主题的见解。捕获局部变量实际上是通过将局部变量“提升”到编译器生成的类的实例变量中来执行的。C#编译器会在适当的时候创建额外类的新实例,并将对局部变量的任何访问权限更改为对关联实例中的实例变量的访问权限。所以表达式树需要是实例中的字段访问——实例本身是通过ConstantExpression提供的。处理如何创建表达式树的最简单方法通常是在lambda表达式中创建类似的东西,然后在Reflector中查看生成的代码,降低优化级别,以便Reflector不会将其转换回lambda表达式.此代码将表达式包装在将局部变量视为常量的闭包块中。字符串filterString="红宝石";varfilterStringParam=Expression.Parameter(typeof(string),"filterString");varstringParam=Expression.Parameter(typeof(string),"x");varblock=Expression.Block(//Addalocalvariable.new[]{filterStringParam},//给局部变量赋一个常量:filterStringParam=filterStringExpression.Assign(filterStringParam,Expression.Constant(filterString,typeof(string))),//比较参数与局部变量Expression.Equal(stringParam,filterStringParam));varx=Expression.Lambda>(block,stringParam).Compile();一个老问题,但我正在尝试为Linq-to-entities(L2E)做一些类似的事情在构建表达式时遇到它在这种情况下你不能使用Expression.Block因为它不能被解析为SQL。这是Jon的回答之后的一个明确示例,该示例适用于L2E。创建一个辅助类来包含过滤器的值:classExpressionScopedVariables{publicStringValue;所以构建树:varscope=newExpressionScopedVariables{Value=filterString};varfilterStringExp=Expression.Constant(scope);vargetVariable=typeof(ExpressionScopedVariables).GetMember("Value")[0];varaccess=Expression.MakeMemberAccess(filterStringExp,getVariable);然后用成员访问表达式替换原代码中的常量:以上是C#学习教程:局部变量和表达式树分享如果对你有用,需要进一步了解C#学习教程,希望大家多多采纳更多关注它——BinaryExpressionequals=Expression.Equal(stringParam,access);表达式>lambda1=Expression.Lambda>(等于,newParameterExpression[]{stringParam});本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: