用 try catch 包装的动态 lambda

Dynamic lambda wrapped with try catch

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

到目前为止,我可以使用此代码使用 DynamicLinq 创建我的过滤器

Expression<Func<ModuleItem, bool>> expr = System.Linq.Dynamic.DynamicExpression.ParseLambda<ModuleItem, bool>(value, null);

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

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

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

经过更多尝试,我成功了。 解决方案是使用 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();