c# - 用于 DynamicExpression.ParseLambda 的 TryParse
问题描述
我正在尝试创建一个评估 DynamicLinq 表达式的函数。虽然表达式本身是有效的,但它可以使用的 Parameter 对象可能并不总是它需要的。
我想要一些方法来检查在实际执行之前是否拥有表达式所需的所有可用参数。目前我发现的最佳选择是将其包装在 try-catch 中并忽略缺少的参数异常。
var ValidLambdaExpression = "ObjectType.Attribute == \"testvalue\" && ObjectType2.Attribute == \"testvalue2\"";
var paramObjects = new List<System.Linq.Expressions.ParameterExpression>();
var p = System.Linq.Expressions.Expression.Parameter(typeof(ObjectType), "ObjectType");
paramObjects.Add(p);
var lam = System.Linq.Dynamic.DynamicExpression.ParseLambda(paramObjects.ToArray(), null, ValidLambdaExpression);
//var lambody = System.Linq.Dynamic.DynamicExpression.Parse(null, ValidLambdaExpression);
//var lam = System.Linq.Expressions.Expression.Lambda(lambody, paramObjects);
var result = DataValidation.ToBoolean(lam.Compile().DynamicInvoke(data));
在上面的代码块中,ValidLambdaExpression
变量可能正在引用数据数组中不存在的对象。如果发生这种情况,ParseLambda
和Parse
线都会爆炸。我还没有找到任何解析 lambda 然后检查缺少的参数,甚至是必需的参数的方法。
此块将因错误而爆炸:
ParseException -> 未知标识符“ObjectType2”
在执行时 paramObjects 是动态构建的,它不是硬编码的,所以我不知道会放入什么对象。
有没有人有更好的方法“在速度方面”在解析 Lambda 之前验证它需要哪些参数?
解决方案
似乎没有人能解决这个问题。这是我最终想出的解决方法。
在构建 Lambda 表达式时,我知道将哪些对象放入其中,即使在需要使用表达式时我还没有这些信息。
所以我最终在表达式前面加上了一个对象的 csv 列表,这样我就可以在使用表达式的方法中访问它们。
表达式最终看起来像这样:
ObjType1,ObjType2,ObjType3|ObjType1.Attribute == ObjType2.Attribute
然后我围绕 DynamicExpressionParser 编写了一个包装器,它能够解析这个字符串并在尝试调用表达式之前做出一些明智的决定。
推荐阅读
- ramda.js - 对于数组中的重复值,如何在 Ramda.js 中使用“重复”
- reactjs - 如何连接mongodb和react js?
- c++ - C++实例化类比较
- c - 以任意顺序使用选项和参数解析命令行
- shell - Gitlab Shell脚本权限被拒绝
- reactjs - Leaflet Map Tiles 适用于计算机浏览器,仅在手机和平板电脑屏幕上显示灰色屏幕
- hadoop - Hive schematool 命令错误 org.apache.hadoop.hive.metastore.HiveMetaException:为初始化指定了未知版本:3.1.0
- c# - Telerik 网格过滤器选项,用于带有 blazor 的下拉菜单
- c - 试图打印数字字符串中的最后一个元素
- python - 使用 rdkit 或其他 python 模块将 SMILES 转换为化学名称或 IUPAC 名称