【问题标题】:Get Object from Delegate Filter Expression Expression<Func<T,bool>>从委托过滤器表达式中获取对象 Expression<Func<T,bool>>
【发布时间】:2012-02-01 16:34:00
【问题描述】:

使用 lambda 委托表达式> - 我的表达式采用 Role 对象 (POCO)。

希望使用该 POCO 角色对象并将其映射到具有匹配属性的数据层角色对象。为此,我需要能够从委托中获取 Role 对象。

例子:

public List<Role> FindAll(Expression<Func<Role, bool>> filter)

像这样调用这个方法:

FindAll(r => r.Name == role.Name);

r 是 Role 类型,在 FindAll 函数中,我可以看到 filter 有一个参数,例如:

我可以提取那个对象吗?如何?

我确信它必须是可行的,毕竟 linq 一直在内部进行......

【问题讨论】:

  • 你为什么要复制Where
  • 您是否尝试将它们投射到专门的Expression's?
  • @leppie 1) 你是什么意思,'我为什么要复制Where? 2) Parameter[0] 是 ParameterExpression 类型 - 到目前为止,我还没有找到任何可以转换为我自己类型的属性,但我仍在尝试。
  • 调试器已经为您列出了所有类型。只需投射到那个,中提琴,你就有了你在调试器中看到的属性。这是一项相当微不足道的任务,不涉及任何魔法:)
  • @TheEvilGreebo 你为什么不能投那个呢?

标签: c# linq lambda expression


【解决方案1】:

这里有两个角色:r,代表过滤器参数,role,是一个被 lambda 表达式封闭的对象。我假设您的意思是您想要引用 role 对象,因为您已经找到了代表 rParameterExpression

该对象将是一个ConstantExpression,其类型为Role,它将是代表role.NameMemberAccessExpressionExpression 属性的值。这将是表示相等测试的 BinaryOperator 表达式的右侧,它充当 lambda 表达式的 Body

这是你需要的吗?

【讨论】:

  • 是和不是。不,这不是我真正想要的——但阅读你的解释有助于明确为什么它不起作用。 (r=>r.name = role.name) 只是一种可能的过滤器。我可以很容易地说 (r=>r.name="Fred") - 它永远不会有角色对象,所以当然,为什么那个对象会存在...
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多