eval(string)到C#代码

JL.*_*JL. 3 c# evaluation runtime

是否可以在运行时在C#中评估以下内容

我有一个包含3类属性(Field,Operator,Value)

 rule.Field;
 rule.Operator;
 rule.Value;
Run Code Online (Sandbox Code Playgroud)

这是我的规则类......

现在我有一个循环

foreach(item in items)
   {
       // here I want to create a dynamic expression to evaluate at runtime
       // something like
       if (item.[rule.field] [rule.operator] [rule.value])
           { do work }
   }
Run Code Online (Sandbox Code Playgroud)

我只是不知道语法,或者它是否可能在C#中,我在JS中知道它可能但是这不是编译语言.

更新

基本上我想要一种方式eval(stringCode)或更好的支持方式.

Jon*_*eet 9

不,C#不直接支持这样的事情.

最接近的选项是:

  • 创建一个完整的有效C#程序并使用它动态编译它CSharpCodeProvider.
  • 构建表达式树,编译并执行它
  • 自己进行评估(这可能实际上最简单,取决于您的操作员等)


Jon*_*nan 5

免责声明:我是Eval Expression.NET项目的所有者

这个库接近于 JS Eval 的等价物。您几乎可以评估和编译所有 C# 语言。

这是一个使用您的问题的简单示例,但该库远远超出了这个简单的场景。

int field = 2;
int value = 1;
string binaryOperator = ">";

string formula = "x " + binaryOperator + " y";

// For single evaluation
var value1 = Eval.Execute<bool>(formula, new { x = field, y = value });

// For many evaluation
var compiled = Eval.Compile<Func<int, int, bool>>(formula, "x", "y");
var value2 = compiled(field, value);
Run Code Online (Sandbox Code Playgroud)

编辑答案评论:

专有库做简单评估?不,谢谢

该库不仅支持简单的求值,还支持几乎所有的 C# 语言。允许你动态添加一个方法,使用async、linq、loop等,这不仅仅是“做简单的评估”

Jon Skeet 提供的最接近的选项解决方案很棒,但肯定需要几天的开发和测试才能支持所有情况,具体取决于运营商。当然,这个库可以帮助一些开发人员,但在其他一些情况下,比如你的情况,没有它也可以完成。


Jar*_*Par 3

我不完全确定你在说什么。你能试着澄清一下吗?

您是否想要获取一个字符串表达式并在运行时在 C# 中对其求值?如果是这样,答案是否定的。C# 不支持此类动态求值。