gpt4 book ai didi

c# - ExpressionTreeVisitor 中 ConstantExpression 的部分求值

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:18 25 4
gpt4 key购买 nike

无论怎么想,我都不是表达式树大师,我拥有的代码如下所示:

    int external = 10;
using(var session = new Session())
{
session.Add(new Product { Name = "test1", Price = 20 });
session.Add(new Product {Name = "test", Price = 10});
var product = session.Products.Where(p => p.Price == external).FirstOrDefault();
Assert.Equal(10, product.Price);
}

Session 实现了您期望从 LINQ Provider 获得的所有 IQueryProvider、IQueryable 接口(interface)。

当我评估表达式树时,一切都按计划进行,直到我阅读了“外部”的 ConstantExpression,此时,我不知道如何前进,因为:

      //constant is ConstantExpression for "external" on the right side of the "p.Price == external" expression above.
var t = constant.GetType(); //evaluates to class called "<>c__DisplayClass2" - with a member named "external" that has the value 10.

问题基本上是.. 我怎样才能访问成员“外部”的值 - 有没有办法在不使用反射的情况下完成此操作?还是我煮熟了?我错过了什么?

最佳答案

您的表达式捕获了 external局部变量,这就是编译器隐式创建匿名类型来包装捕获的变量的原因。等式的右侧部分不是 ConstantExpression , 它实际上是一个 MemberExpression , 谁的 Expression属性是 ConstantExpression类型 <>c__DisplayClass2

您可以按如下方式访问该属性的值:

MemberExpression memberExpr = /* right-hand side of the equality */ as MemberExpression;
ConstantExpression constantExpr = memberExpr.Expression as ConstantExpression;
PropertyInfo prop = memberExpr.Member as PropertyInfo;
object value = prop.GetValue(constantExpr.Value, null);

关于c# - ExpressionTreeVisitor 中 ConstantExpression 的部分求值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2529985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com