我想通过用户定义的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参数?
答案 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();