我的最终目标是遍历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,并冒泡并确定每个后续成员表达式是否为空.
expry已经包含一个由成员表达式绑定的参数(我们称之为),所以expr看起来像y => y.Member.Something.
当你构造新的 lambda 表达式时,wee你给它一个新的参数x,所以wee看起来像x => y.Member,这没有意义。
expr因此,您需要重用for的参数wee。