如何从Expression <func <t,bool =“”>&gt;获取属性,运算符和值?谓词?</FUNC <t时,>

时间:2011-11-07 08:19:06

标签: c# linq reflection expression-trees func

有没有办法从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

我已经编写了可以提取Expression的属性名称的东西,但我似乎无法找到值和运算符的位置,尽管它在Expression的DebugView属性中非常清晰可见。

2 个答案:

答案 0 :(得分:8)

运营商将位于BinaryExpression Method节点Equals上。您还应该查看表达式.NodeType,其中显示的内容很多(应该是Equal)。

通常位于ConstantExpression的{​​{1}}中的.Right,或者是捕获的变量:捕获上下文将是BinaryExpression,因此将比ConstantExpressionMemberExpression(您需要调查成员是否是ConstantExpression vs FieldInfo,并通过PropertyInfo获取值。

答案 1 :(得分:3)

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

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

我通常使用该类将我感兴趣的表达式推送到只读列表中,例如,然后我可以在我的类实现中公开使用它。你没有用它来重写表达式。