【发布时间】: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 => y.Member(其中 y 是来自expr的参数),这是没有意义的。 -
@ckuri 是的,就是这样。请将此作为答案,以便我将其标记为正确。
-
按照您的建议完成。
-
你见过那个解决方案 - stackoverflow.com/a/21936366/968003 吗?