C# 如何从表达式中获取属性、运算符和值<;Func<;T、 布尔>&燃气轮机;谓语
是否有任何方法可以从C# 如何从表达式中获取属性、运算符和值<;Func<;T、 布尔>&燃气轮机;谓语,c#,linq,reflection,expression-trees,func,C#,Linq,Reflection,Expression Trees,Func,是否有任何方法可以从表达式中提取属性、运算符和匹配值?给出以下示例: var customers = GetCustomers(); var customerQuery = customers.Where(x=> x.CustomerID == 1 && x.CustomerName == "Bob"); // The query is for illustration only 我需要能够获得如下信息: Property: CustomerID Operato
表达式
中提取属性、运算符和匹配值?给出以下示例:
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属性中非常清晰可见 操作符将位于
二进制表达式
的方法
上,即等于
节点。您还应该查看表达式.NodeType
,它显示了很多内容(应该是相等的
)
值通常位于该
二进制表达式的右侧的常量表达式中,或者在捕获变量的情况下:捕获上下文将是常量表达式
,因此该值将是常量表达式
上的成员表达式
(您需要调查该成员是否是FieldInfo
vsPropertyInfo
,并通过.GetValue(…)
获取该值)。除了Marc Gravels答案(+1)之外,我只想补充一点,值得一看这个类(在.Net 4;MSDN中有一个示例,您可以在3.5中复制/粘贴)。它使编写代码以提取特定类型的表达式变得非常简单
在您的情况下,您将希望覆盖它的方法
例如,我通常使用该类将感兴趣的表达式推送到只读列表中,然后在类的实现中公开该列表。您不会使用它重写表达式。非常好,谢谢。只需使用(BinaryExpression)强制转换谓词
predicate.Body
现在一切都很明显了。为Marc干杯。+1,谢谢。这当然会让查找二进制表达式变得更容易,但我会让Marc的答案被接受,因为它说明了如何提取我所需的信息。是的,我同意-Marc的答案为你提供了这个问题的基本细节,值得打勾;我的答案只有一个提供一个简单的方法来实现他的建议:)