Kei*_*ald 15 c# lambda expression-trees
我试图在项目中使用Lambda Expressions映射到第三方查询API.所以,我正在手工解析Expression树.
如果我传入一个lambda表达式,如:
p => p.Title == "title"
Run Code Online (Sandbox Code Playgroud)
一切正常.
但是,如果我的lambda表达式如下:
p => p.Title == myaspdropdown.SelectedValue
Run Code Online (Sandbox Code Playgroud)
使用.NET调试器,我没有看到该函数的实际值.相反,我看到类似的东西:
p => p.Title = (value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?当我尝试将表达式的右侧作为字符串抓取时,我得到的(value(ASP.usercontrols_myaspusercontrol_ascx).myaspdropdown.SelectedValue)
不是实际值.我如何获得实际价值?
Bev*_*van 21
请记住,当您将lambda表达式作为表达式树处理时,您没有可执行代码.相反,你有一个表达元素树,它构成了你写的表达式.
Charlie Calvert有一篇很好的帖子,详细讨论了这一点.包含使用表达式可视化器来调试表达式的示例.
在您的情况下,要获取相等表达式右侧的值,您需要创建一个新的lambda表达式,编译它然后再调用它.
我已经把一个快速的例子写在了一起 - 希望它能满足你的需求.
public class Class1
{
public string Selection { get; set; }
public void Sample()
{
Selection = "Example";
Example<Book, bool>(p => p.Title == Selection);
}
public void Example<T,TResult>(Expression<Func<T,TResult>> 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<Func<string>>(equality.Right);
Func<string> accessor = accessorExpression.Compile();
var value = accessor();
Debug.Assert(value == Selection);
}
}
public class Book
{
public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)