首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问成员表达式的值

访问成员表达式的值
EN

Stack Overflow用户
提问于 2010-04-11 17:58:04
回答 9查看 51.2K关注 0票数 70

如果我有产品的话。

代码语言:javascript
复制
var p = new Product { Price = 30 };

我有以下linq查询。

代码语言:javascript
复制
var q = repo.Products().Where(x=>x.Price == p.Price).ToList()

在IQueryable提供程序中,我为包含一个常量表达式的p.Price返回了一个MemberExpression,但是我似乎无法从其中获得值"30“。

更新我已经尝试过了,但似乎不起作用。

代码语言:javascript
复制
var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);

干杯。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-04-11 20:25:43

您可以编译和调用以成员访问为主体的lambda表达式:

代码语言:javascript
复制
private object GetValue(MemberExpression member)
{
    var objectMember = Expression.Convert(member, typeof(object));

    var getterLambda = Expression.Lambda<Func<object>>(objectMember);

    var getter = getterLambda.Compile();

    return getter();
}

解析表达式树时,局部求值是一种常见的技术。LINQ to SQL在相当多的地方做了这件事。

票数 123
EN

Stack Overflow用户

发布于 2010-12-10 07:15:33

代码语言:javascript
复制
 MemberExpression right = (MemberExpression)((BinaryExpression)p.Body).Right;
 Expression.Lambda(right).Compile().DynamicInvoke();
票数 36
EN

Stack Overflow用户

发布于 2010-04-11 20:17:36

常量表达式将指向编译器生成的捕获类。我没有包括决策点等,但以下是如何从中获得30点:

代码语言:javascript
复制
var p = new Product { Price = 30 };
Expression<Func<Product, bool>> predicate = x => x.Price == p.Price;
BinaryExpression eq = (BinaryExpression)predicate.Body;
MemberExpression productToPrice = (MemberExpression)eq.Right;
MemberExpression captureToProduct = (MemberExpression)productToPrice.Expression;
ConstantExpression captureConst = (ConstantExpression)captureToProduct.Expression;
object product = ((FieldInfo)captureToProduct.Member).GetValue(captureConst.Value);
object price = ((PropertyInfo)productToPrice.Member).GetValue(product, null);

price现在是30。请注意,我假设Price是一个属性,但实际上您需要编写一个处理属性/字段的GetValue方法。

票数 29
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2616638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档