Lambda表达式树解析我在我的项目中尝试使用Lambda表达式映射到第三方查询API。所以,我正在手动解析表达式树。如果我传入一个lambda表达式,例如:p=>p.Title=="title"一切正常。但是,如果我的lambda表达式如下:p=>p.Title==myaspdropdown.SelectedValue使用.NET调试器,我看不到函数的实际值。相反,我看到类似的内容:p=>p.Title=(value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)给出了什么?当我尝试将表达式的右侧作为字符串获取时,我得到(value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)而不是实际值。我如何获得实际价值?请记住,当您将lambda表达式作为表达式树处理时,您没有可执行代码。相反,您有一棵表达式元素树,它们构成了您编写的表达式。查理·卡尔弗特(CharlieCalvert)有一篇精彩的帖子详细讨论了这一点。包含使用表达式可视化工具调试表达式的示例。在您的情况下,要获取相等表达式右侧的值,您需要创建一个新的lambda表达式,编译它然后调用它。我整理了一个简单的例子——希望它能满足你的需要。公共类Class1{公共字符串选择{得到;放;}publicvoidSample(){Selection="Example";例子(p=>p.Title==Selection);}publicvoidExample(Expression>exp){BinaryExpressionequality=(BinaryExpression)exp.Body;Debug.Assert(equality.NodeType==ExpressionType.Equal);//请注意,您需要知道等式右侧的类型varaccessorExpression=Expression.Lambda>(equality.Right);Funcaccessor=accessorExpression.Compile();变量值=存取器();Debug.Assert(value==Selection);}}publicclassBook{publicstringTitle{get;放;}}要获得您需要的实际值,请将表达式树的逻辑应用于给定的任何上下文。表达式树的全部要点在于它们将逻辑表示为数据而不是评估表达式。您需要弄清楚lambda表达式到底是什么。这可能意味着要根据本地数据评估其中的某些部分——您需要自己决定。表达式树非常强大,但解析和使用它们并非易事。(问问任何写过LINQ提供程序的人...FransBouma多次哀叹这些困难。)刚刚遇到同样的问题,谢谢Bevan。在扩展上,以下是可用于提取值的通用模式(在我的查询引擎中使用此模式)。[TestFixture]publicclassTestClass{[Test]publicvoidTEst(){varuser=newUser{Id=123};varidToSearch=user.Id;varquery=Creator.CreateQuery().Where(x=>x.Id==idToSearch);}}publicclassQuery{publicQueryWhere(Expression>filter){varrightValue=GenericHelper.GetVariableValue(((BinaryExpression)((UnaryExpression)filter.Body.Operand).Right.Type,((BinaryExpression)((UnaryExpression)filter.Body).Operand).Right);Console.WriteLine(rightValue);归还这个;}}内部类GenericHelper{内部静态对象GetVariableValue(类型变量类型,表达式表达式){vartargetMethodInfo=typeof(InvokeGeneric).GetMethod(“GetVariableValue”);vargenericTargetCall=targetMethodInfo.MakeGenericMethod(variableType);返回genericTargetCall.Invoke(newInvokeGeneric(),new[]{expression});}}internalclassInvokeGeneric{publicTGetVariableValue(Expressionexpression)whereT:class{varaccessorExpression=表达式.Lambda>(表达式);varaccessor=accessorExpression.Compile();返回访问器();我不确定我明白你在哪里“看到”那个?那是在设计时还是在运行时?Lambda表达式基本上可以被认为是匿名委托,并且可以延迟执行。因此,显然,在执行通过之前,您不应该期望看到分配的值。我不认为那真的是你的意思......如果你把问题弄清楚了,我可以帮忙:)以上就是C#学习教程:Lambda表达式树解析的全部内容,如果对大家有用需要的话了解更多关于C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
