1

我正在使用 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我想用 && 和 EqualsTo 替换 AND ==

有没有办法做到这一点?这基本上是为了允许用户使用自然语言自由地创建这样的表达式,然后可以将其输入到评估引擎中。

4

1 回答 1

0

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

所以这个机制不能用 && 代替 AND 之类的词。

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

于 2018-10-24T18:38:46.087 回答