首页 > 解决方案 > 用于 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变量可能正在引用数据数组中不存在的对象。如果发生这种情况,ParseLambdaParse线都会爆炸。我还没有找到任何解析 lambda 然后检查缺少的参数,甚至是必需的参数的方法。

此块将因错误而爆炸:

ParseException -> 未知标识符“ObjectType2”

在执行时 paramObjects 是动态构建的,它不是硬编码的,所以我不知道会放入什么对象。

有没有人有更好的方法“在速度方面”在解析 Lambda 之前验证它需要哪些参数?

标签: c#linq

解决方案


似乎没有人能解决这个问题。这是我最终想出的解决方法。

在构建 Lambda 表达式时,我知道将哪些对象放入其中,即使在需要使用表达式时我还没有这些信息。

所以我最终在表达式前面加上了一个对象的 csv 列表,这样我就可以在使用表达式的方法中访问它们。

表达式最终看起来像这样:

ObjType1,ObjType2,ObjType3|ObjType1.Attribute == ObjType2.Attribute

然后我围绕 DynamicExpressionParser 编写了一个包装器,它能够解析这个字符串并在尝试调用表达式之前做出一些明智的决定。


推荐阅读