在 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 替换为 &&。
我正在使用 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,用 ==
有办法实现吗?这基本上是为了允许用户使用自然语言自由创建这样的表达式,然后将其输入评估引擎。
当您使用全局对象时,Roslyn 不会用相应的值替换代码中的那些名称,您的代码实际上是在引用该全局对象实例上的那些字段。
所以这个机制将无法用 && 替换像 AND 这样的词。
相反,您可以预处理脚本文本并在尝试执行之前将 AND 替换为 &&。