我试图在项目中使用Lambda Expressions映射到第三方查询API.所以,我正在手工解析Expression树.
如果我传入一个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表达式作为表达式树处理时,您没有可执行代码.相反,你有一个表达元素树,它构成了你写的表达式.
Charlie Calvert有一篇很好的帖子,详细讨论了这一点.包含使用表达式可视化器来调试表达式的示例.
在您的情况下,要获取相等表达式右侧的值,您需要创建一个新的lambda表达式,编译它然后再调用它.
我已经把一个快速的例子写在了一起 - 希望它能满足你的需求.
public class Class1 { public string Selection { get; set; } public void Sample() { Selection = "Example"; Example(p => p.Title == Selection); } public void Example (Expression > exp) { BinaryExpression equality = (BinaryExpression)exp.Body; Debug.Assert(equality.NodeType == ExpressionType.Equal); // Note that you need to know the type of the rhs of the equality var accessorExpression = Expression.Lambda >(equality.Right); Func accessor = accessorExpression.Compile(); var value = accessor(); Debug.Assert(value == Selection); } } public class Book { public string Title { get; set; } }