我正在尝试使用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。
答案 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)";
// ...