用 try catch 包裹的动态 lambda

本文关键字:动态 lambda 包裹 try catch | 更新日期: 2023-09-27 17:57:10

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

用 try catch 包裹的动态 lambda

经过几次尝试,我得到了这个工作。解决方案是使用 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();