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)";
// ...
我正在尝试使用 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。
更新:请参阅 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)";
// ...