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