- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
无论怎么想,我都不是表达式树大师,我拥有的代码如下所示:
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/
给定Msdn:常量表达式是可以在编译时完全计算的表达式。 但是在下面的示例代码中,我有一个无法在编译时评估的 contantExpression。 我应该错过一些东西,但是什么? public cla
给定 Msdn:常量表达式是可以在编译时完全求值的表达式。 但是在下面的示例代码中,我有一个无法在编译时求值的 contantExpression。 我应该错过了什么,但是什么? public cla
当 ConstantExpression 值为 null 时,如何确定它的类型?我以前一直使用以下代码检测类型,但是当 ConstantExpression 值为 null 时它会导致 null 异常
我正在寻找一个值 var guid = Guid.Parse("SOMEGUID-GUID-GUID-GUID-SOMEGUIDGUID"); Expression> selector = x =>
我创建了一个覆盖 VisitConstant 的 ExpressionVisitor 实现。但是,当我创建一个使用局部变量的表达式时,我似乎无法获得该变量的实际值。 public class Pers
无论怎么想,我都不是表达式树大师,我拥有的代码如下所示: int external = 10; using(var session = new Session()) {
我尝试实现自己的表达式序列化器/反序列化器,以便通过服务传递它(我想实现我自己的 EF Core 服务端点)。所以,现在我对 LambdaExpressions 中的集合有问题。例如, var dat
我尝试实现自己的表达式序列化器/反序列化器,以便通过服务传递它(我想实现我自己的 EF Core 服务端点)。所以,现在我对 LambdaExpressions 中的集合有问题。例如, var dat
我有一些代码生成表达式作为数据库中读取的“where”语句传递,我正在尝试加快速度。 下面的示例使用 where 语句来匹配具有传入值的表的 PK: private Expression MakeWh
下面是我的问题的简单演示代码。 [TestClass] public class ExpressionTests { [TestMethod] public void TestPara
这个问题在 NHibernate 2 和 3 中都会出现。我有一个类 A,它有一个类 B 的成员集。直接查询类可以很好地执行。但是,当我将涉及类 B 的表达式之一传递到方法中时,出现以下错误: Sys
这个问题在 NHibernate 2 和 3 中都会出现。我有一个类 A,它有一个类 B 的成员集。直接查询类可以很好地执行。但是,当我将涉及类 B 的表达式之一传递到方法中时,出现以下错误: Sys
我是一名优秀的程序员,十分优秀!