System.Linq.Dynamic.DynamicExpression 使用枚举参数解析表达式

System.Linq.Dynamic.DynamicExpression parsing expressions with enum parameters

我正在尝试使用 DynamicExpression.ParseLambda 解析 LambdaExpression 树,但是当使用 string.Equals 和 StringComparison 枚举时我无法正确解析它。

我试过:

a) 使用 StringComparison 但出现错误“未知标识符 'StringComparison'”。

b) 使用 System.StringComparison 的完整命名空间,但出现错误“未知标识符 'System'”。

    [TestMethod()]
    public void CanParseStringEqualsWithEnum()
    {
        var input = @"p0.Equals(""Testing"", StringComparison.InvariantCultureIgnoreCase)";

        var p0 = Expression.Parameter(typeof(string), "p0");

        System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p0 }, typeof(bool), input);
    }

删除 StringComparison 有效。

[TestMethod()]
public void CanParseStringEqualsWithEnum()
{
    var input = @"p0.Equals(""Testing"")";

    var p0 = Expression.Parameter(typeof(string), "p0");

    System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p0 }, typeof(bool), input);
}

我可以对两个字符串执行 .ToUpper() 并以这种方式进行比较,但我知道这并不涵盖所有情况,最好使用 StringComparison。

并继续修补 System.Linq.Dynamic 库的源代码。 从 GitHub 下载包源并将 System.StringComparison 添加到 System.ExpressionParser.

中的 "predefinedTypes" 类型数组

更新:请参阅 Stef 的回答以获得更好的解决方案:

另一种解决方案(不涉及 code-changes)是使用值 3 进行枚举。

当使用 System.Linq.Dynamic.Core 时,以下代码有效:

var input = @"p0.Equals(""Testing"", 3)";
var p0 = Expression.Parameter(typeof(string), "p0");
var expression = DynamicExpressionParser.ParseLambda(new[] { p0 }, typeof(bool), input);
Delegate del = expression.Compile();
var result = del.DynamicInvoke("testing") as bool?;

更新

我已经更改了 System.Linq.Dynamic.Core(版本 1.0.16)的代码。现在也可以使用:

var input = @"p0.Equals(""Testing"", StringComparison.InvariantCultureIgnoreCase)";
// ...