【问题标题】:How do you create a lambda expression from a MemberExpression如何从 MemberExpression 创建 lambda 表达式
【发布时间】:2017-12-15 06:27:47
【问题描述】:

我的最终目标是遍历 lambda 表达式中的嵌套属性并确定是否有任何属性为空,但我无法根据成员表达式创建新的 lambda 表达式。

采取这个虚拟方法:

public static void DoStuff<TModelDetail, TValue>(Expression<Func<TModelDetail, TValue>> expr, TModelDetail detail)
{
    var memberExpression = expr.Body as MemberExpression;
    if (memberExpression == null && expr.Body is UnaryExpression)
    {
        memberExpression = ((UnaryExpression)expr.Body).Operand as MemberExpression;
    }

    var pe = Expression.Parameter(typeof(TModelDetail), "x");
    var convert = Expression.Convert(memberExpression, typeof(object));
    var wee = Expression.Lambda<Func<TModelDetail, object>>(convert, pe);
    var hey = wee.Compile()(detail);            
}

在 Compile.exec 行我收到以下错误:

从范围“”引用的“Blah”类型的变量“x”,但未定义

其中 Blah 是 TModelDetail 的类型。

如何使用 MemberExpression 构建 lambda?我最终要做的是递归查找根成员表达式,判断它是否为空,然后冒泡判断每个后续成员表达式是否为空。

【问题讨论】:

  • 不要创建新参数,而是使用来自expr 的参数,因为您的成员表达式中使用了这个参数。目前,您的 wee 类似于 x =&gt; y.Member(其中 y 是来自 expr 的参数),这是没有意义的。
  • @ckuri 是的,就是这样。请将此作为答案,以便我将其标记为正确。
  • 按照您的建议完成。
  • 你见过那个解决方案 - stackoverflow.com/a/21936366/968003 吗?

标签: c# lambda


【解决方案1】:

expr 已经包含一个参数(我们称之为y),它被你的成员表达式绑定,所以expr 看起来像y =&gt; y.Member.Something。

当你构造新的 lambda 表达式 wee 时,你给它一个新参数 x,所以 wee 看起来像 x =&gt; y.Member,这没有意义。

因此,您需要将expr 中的参数重用于wee。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多