Иметь заполнители для логических операторов в строке кода Roshyn's CSharpScript - PullRequest
0 голосов
/ 24 октября 2018

Я использую возможности Roslyn для создания «выражений» в виде строк, представляющих собой фрагменты кода с заполнителями.Во время выполнения двигатель заменяет заполнители их значениями и оценивает выражение.Например, выражение будет выглядеть как

From =="someEmail@something.com" && SentDate > "12-Nov-2017"

Здесь слова «From» и «SentDate» являются заполнителями, которые заменяются значениями во время выполнения.Вот как выглядит код

public class Globals
    {
        public string From { get; set; }
        public string To { get; set; }
        public string SentDate { get; set; }
    }
void RunCode()
    {
        if (code == null)
        {
            code = CSharpScript.Create<bool>(@"From =="someEmail@something.com" && SentDate > "12-Nov-2017"", ScriptOptions.Default.WithImports("System", "System.IO"), globalsType: typeof(Globals));

            code.Compile();
        }
        object s = code.RunAsync(new Globals() { From = "someEmail@something.com", SentDate = "12-Nov-2017"}).Result.ReturnValue;

        MessageBox.Show(s.ToString());
    }

Все работает, как и ожидалось.

Теперь я хочу сделать еще один шаг и заменить операторы, такие как && и ==, их читаемыми людьми аналогами.такие как AND и EqualsTo.Таким образом, по сути, выражение должно стать

From EqualsTo "someEmail@something.com" AND SentDate > "12-Nov-2017"

И затем каким-то образом при вызове CSharp.Create я бы хотел заменить AND на && и EqualsTo на ==

Есть ли способдостичь этого?Это в основном позволяет пользователям свободно создавать такие выражения с использованием естественного языка, который затем может быть передан в механизм оценки.

1 Ответ

0 голосов
/ 24 октября 2018

Когда вы используете объект Globals, Roslyn не заменяет эти имена в вашем коде соответствующими значениями, ваш код фактически ссылается на эти поля в этом экземпляре объекта globals.

Таким образом, этот механизм не сработает для замены слов, подобных AND, на &&.

Вместо этого вы можете предварительно обработать текст сценария и заменить AND на &&, прежде чем пытаться выполнить его.

...