用try catch包裹的动态lambda

时间:2015-06-18 17:02:55

标签: c# linq dynamic lambda

我想通过用户定义的Where调用过滤IEnumerable<ModuleItem>(所以表达式由String对象给出)

到目前为止,我可以使用此代码

创建带有DynamicLinq的过滤器
Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null);

问题是,如果对集合中的项目的评估失败,则整体过滤将失败。所以我想在lambda中捕获异常并返回false,而不是过滤掉失败的项目。

我尝试用TryExpression.TryCatch(...)包装表达式,但我无法取回Expression<Func<ModuleItem, bool>>

如何包装动态表达式并返回一个Expression<Func<ModuleItem, bool>>对象作为Where参数?

1 个答案:

答案 0 :(得分:1)

经过多次尝试,我得到了这个工作。 解决方案是使用trycatch来包装表达式的主体而不是表达式本身,然后使用表达式参数创建生成的lambda。

否则我得到的东西(不确定)Func<ModulelItem, bool, bool>

所以最终的代码是

Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null);
Expression triedExpr = TryExpression.TryCatch(expr.Body, Expression.Catch(typeof(Exception), Expression.Constant(false)));
Func<ModuleItem, bool> whereDelegate = Expression.Lambda<Func<ModuleItem, bool>>(triedExpr, expr.Parameters).Compile();