System.Linq.Dynamic.DynamicExpression解析具有枚举参数的表达式

时间:2019-06-05 10:20:42

标签: c# linq expression-trees dynamic-linq

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

我尝试过:

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

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

    [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。

2 个答案:

答案 0 :(得分:1)

Found this answer,并修补了System.Linq.Dynamic库的源代码。 从GitHub下载了程序包源,并将System.StringComparison添加到System.ExpressionParser中的Types的“ predefinedTypes”数组中。

更新:请参阅Stef的答案以获得更好的解决方案:https://stackoverflow.com/a/56472200/785965

答案 1 :(得分:1)

另一种解决方案(不涉及代码更改)是使用值 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)";
// ...