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