我正在尝试创建一个评估 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 之前验证它需要哪些参数?