在 Roslyn 的 CSharpScript 代码字符串中有逻辑运算符的占位符

Have placeholders for logical operators in Roslyn's CSharpScript code string

我正在使用 Roslyn 的功能将 "Expressions" 创建为带有占位符的代码片段的字符串。在 运行 时间,引擎用它们的值替换占位符并计算表达式。例如,一个表达式看起来像

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

有办法实现吗?这基本上是为了允许用户使用自然语言自由创建这样的表达式,然后将其输入评估引擎。

当您使用全局对象时,Roslyn 不会用相应的值替换代码中的那些名称,您的代码实际上是在引用该全局对象实例上的那些字段。

所以这个机制将无法用 && 替换像 AND 这样的词。

相反,您可以预处理脚本文本并在尝试执行之前将 AND 替换为 &&。