如何从MemberExpression创建lambda表达式

dtr*_*yan 5 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);            
}
Run Code Online (Sandbox Code Playgroud)

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

从范围''引用的'Blah'类型的变量'x',但它没有定义

其中Blah是TModelDetail的类型.

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

cku*_*uri 4

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

\n\n

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

\n\n

expr因此,您需要重用for的参数wee

\n