是否有任何方法可以从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属性中非常清晰可见。
操作符将位于BinaryExpression
的Method
上,即Equals
节点。您还应该查看表达式.NodeType
,它揭示了很多(它应该是Equal
)。
值通常在BinaryExpression
的.Right
中的ConstantExpression
中,或者在捕获变量的情况下:捕获上下文将是ConstantExpression
,因此值将是ConstantExpression
之上的MemberExpression
(您需要调查成员是FieldInfo
还是PropertyInfo
,并通过.GetValue(...)
获取值)。
除了Marc Gravells的回答(这里+1)之外,我还要补充一点,值得看看ExpressionVisitor
类(在。net 4中开箱使用;MSDN有一个例子,你可以复制/粘贴3.5)。它使得编写代码来提取特定类型的表达式非常非常容易。
在你的情况下,你会寻找覆盖它的VisitBinary
方法。