如何从MemberExpression创建lambda表达式

时间:2017-12-15 06:27:47

标签: c# lambda

我的最终目标是遍历lambda表达式中的嵌套属性并确定是否有任何属性为null,但是我在基于成员表达式创建新的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行上,我收到以下错误:

  

变量&#39; x&#39;类型&#39; Blah&#39;引用范围&#39;&#39;,但未定义

其中Blah是TModelDetail的类型。

如何使用MemberExpression构建lambda?我最终想要做的是递归地找到根成员表达式,确定它是否为null,并冒泡并确定每个后续成员表达式是否为空。

1 个答案:

答案 0 :(得分:4)

expr已经包含一个由您的成员表达式绑定的参数(我们称之为y),因此expr看起来像y => y.Member.Something

当你构造新的lambda Expression wee时,你给它一个新的参数x,所以wee看起来像x => y.Member,这没有意义。< / p>

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