【问题标题】:System.Linq.Dynamic.DynamicExpression parsing expressions with enum parametersSystem.Linq.Dynamic.DynamicExpression 使用枚举参数解析表达式
【发布时间】:2019-06-05 10:20:42
【问题描述】:

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

我试过了:

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。

【问题讨论】:

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


    【解决方案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)";
    // ...
    

    【讨论】:

    • 很高兴发现有一个 github 项目正在积极更新。感谢您的快速更改,现在改用此项目。
    【解决方案2】:

    Found this answer 并着手修补 System.Linq.Dynamic 库的源代码。 从 GitHub 下载包源并将 System.StringComparison 添加到 System.ExpressionParser 中的“预定义类型”数组中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 2015-04-20
      • 2013-08-26
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多