当前位置:  开发笔记 > 编程语言 > 正文

Lambda表达式树解析

如何解决《Lambda表达式树解析》经验,为你挑选了1个好方法。

我试图在项目中使用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)不是实际值.我如何获得实际价值?



1> Bevan..:

请记住,当您将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; }
}

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有