【问题标题】:How do you get the properties, operators and values from an Expression<Func<T, bool>> predicate?如何从 Expression<Func<T, bool>> 谓词中获取属性、运算符和值?
【发布时间】:2011-11-07 08:19:05
【问题描述】:

有没有办法从Expression&lt;Func&lt;T&gt;,bool&gt; 中提取属性、运算符和匹配值?举个例子:

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 属性中非常清晰可见。

【问题讨论】:

    标签: c# linq reflection expression-trees func


    【解决方案1】:

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

    通常会在.Right 中的ConstantExpressionBinaryExpression,或者在捕获变量的情况下:capture-context 将是 ConstantExpression,因此 将是 MemberExpression 而不是 ConstantExpression(您需要调查该成员是 FieldInfo 还是 PropertyInfo,然后获取通过.GetValue(...) 获得的值)。

    【讨论】:

    • 太好了,谢谢。只需使用(BinaryExpression)predicate.Body 投射predicate,现在一切都很明显。干杯马克。
    【解决方案2】:

    除了 Marc Gravells 的回答(在那里 +1),我只想补充一点,值得一看 ExpressionVisitor 类(在 .Net 4 中开箱即用;MSDN 有一个示例,您可以复制/粘贴为 3.5)。它使编写代码来提取某些类型的表达式变得非常非常容易。

    在您的情况下,您将希望覆盖它的 VisitBinary 方法。

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

    【讨论】:

    • +1,谢谢。它确实使查找二进制表达式变得更容易,但我会保留 Marc 的答案,因为它说明了如何提取我需要的信息。
    • 是的,我同意 - 马克的回答为您提供了这个问题的具体细节,值得一试;我的只是提供一种简单的方法来实现他的建议:)
    猜你喜欢
    • 2021-06-17
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多