Я использую возможности 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 на ==
Есть ли способдостичь этого?Это в основном позволяет пользователям свободно создавать такие выражения с использованием естественного языка, который затем может быть передан в механизм оценки.