如何从一个表达式中获得属性、操作符和值?谓词

本文关键字:属性 操作符 谓词 表达式 一个 | 更新日期: 2023-09-27 18:13:45

是否有任何方法可以从Expression<Func<T>,bool>中提取属性,操作符和匹配值?给定以下示例:

var customers = GetCustomers();
var customerQuery = customers.Where(x=> x.CustomerID == 1 
    && x.CustomerName == "Bob"); // The query is for illustration only

我需要能够输出如下内容:

Property: CustomerID
Operator: Equals
Value:    1
Property: CustomerName
Operator: Equals
Value:    Bob

我已经写了一些东西,可以拉出表达式的属性名称,但我似乎无法找出值和操作符的保存位置,尽管它在表达式的DebugView属性中非常清晰可见。

如何从一个表达式中获得属性、操作符和值?谓词

操作符将位于BinaryExpressionMethod上,即Equals节点。您还应该查看表达式.NodeType,它揭示了很多(它应该是Equal)。

通常在BinaryExpression.Right中的ConstantExpression中,或者在捕获变量的情况下:捕获上下文将是ConstantExpression,因此将是ConstantExpression之上的MemberExpression(您需要调查成员是FieldInfo还是PropertyInfo,并通过.GetValue(...)获取值)。

除了Marc Gravells的回答(这里+1)之外,我还要补充一点,值得看看ExpressionVisitor类(在。net 4中开箱使用;MSDN有一个例子,你可以复制/粘贴3.5)。它使得编写代码来提取特定类型的表达式非常非常容易。

在你的情况下,你会寻找覆盖它的VisitBinary方法。

例如,我通常使用类将感兴趣的表达式压入只读列表,然后在类的实现中公开提供该列表。你不能用它来重写表达式