gpt4 book ai didi

c# - 用 try catch 包装的动态 lambda

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:26 25 4
gpt4 key购买 nike

我想过滤一个 IEnumerable<ModuleItem>通过用户定义的 Where 调用(因此表达式由 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 参数的对象 ?

最佳答案

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

关于c# - 用 try catch 包装的动态 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30921500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com