Выражения синтаксического анализа System.Linq.Dynamic.DynamicExpression с параметрами перечисления - PullRequest
1 голос
/ 05 июня 2019

Я пытаюсь выполнить синтаксический анализ дерева LambdaExpression, используя DynamicExpression.ParseLambda, но не могу его правильно проанализировать при использовании string.Equals с перечислением StringComparison.

Я пробовал:

а) с использованием 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 ]

1 голос
/ 06 июня 2019

Другое решение (которое не включает изменения кода) использует значение 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?;

UPDATE

Я изменил код для System.Linq.Dynamic.Core (версия 1.0.16). Теперь также можно использовать:

var input = @"p0.Equals(""Testing"", StringComparison.InvariantCultureIgnoreCase)";
// ...
1 голос
/ 05 июня 2019

Нашел этот ответ и пошел на исправление исходников для библиотеки System.Linq.Dynamic.Загрузил исходные коды пакета из GitHub и добавил System.StringComparison в массив типов «предопределенных типов» в System.ExpressionParser.

ОБНОВЛЕНИЕ : См. Ответ Стефа для лучшего решения: https://stackoverflow.com/a/56472200/785965

...