Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从表达式中获取属性、运算符和值<;Func<;T、 布尔>&燃气轮机;谓语_C#_Linq_Reflection_Expression Trees_Func - Fatal编程技术网

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
vs
PropertyInfo
,并通过
.GetValue(…)
获取该值)。

除了Marc Gravels答案(+1)之外,我只想补充一点,值得一看这个类(在.Net 4;MSDN中有一个示例,您可以在3.5中复制/粘贴)。它使编写代码以提取特定类型的表达式变得非常简单

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


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

非常好,谢谢。只需使用
(BinaryExpression)强制转换
谓词
predicate.Body
现在一切都很明显了。为Marc干杯。+1,谢谢。这当然会让查找二进制表达式变得更容易,但我会让Marc的答案被接受,因为它说明了如何提取我所需的信息。是的,我同意-Marc的答案为你提供了这个问题的基本细节,值得打勾;我的答案只有一个提供一个简单的方法来实现他的建议:)