有没有办法从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属性中非常清晰可见。
答案 0 :(得分:8)
运营商将位于BinaryExpression
Method
节点Equals
上。您还应该查看表达式.NodeType
,其中显示的内容很多(应该是Equal
)。
值通常位于ConstantExpression
的{{1}}中的.Right
,或者是捕获的变量:捕获上下文将是BinaryExpression
,因此值将比ConstantExpression
更MemberExpression
(您需要调查成员是否是ConstantExpression
vs FieldInfo
,并通过PropertyInfo
获取值。
答案 1 :(得分:3)
除了Marc Gravells的回答(+1那里)我还要补充一点,值得看一下ExpressionVisitor
类(.Net 4中的开箱即用; MSDN有一个例子,你可以复制/粘贴3.5)。它使编写代码非常容易提取某些类型的表达式。
在您的情况下,您可能希望覆盖它的VisitBinary
方法。
我通常使用该类将我感兴趣的表达式推送到只读列表中,例如,然后我可以在我的类实现中公开使用它。你没有用它来重写表达式。