gpt4 book ai didi

c# - Lambda 表达式树解析

转载 作者:可可西里 更新时间:2023-11-01 07:54:41 26 4
gpt4 key购买 nike

我正在尝试在项目中使用 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 表达式作为表达式树处理时,您没有可执行代码。相反,您有一棵表达式元素树,它们构成了您编写的表达式。

查理卡尔弗特有 a good post详细讨论了这一点。包括使用表达式可视化工具调试表达式的示例。

在您的情况下,要获取相等表达式右侧的值,您需要创建一个新的 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; }
}

关于c# - Lambda 表达式树解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/238413/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com