在C#中是否有eval函数?

我在一个textbox输入一个方程式,它将生成给定抛物线的图形。 是否可以使用评估function? 我的C#2010没有microsoft.jscript

C#没有可比的Eval函数,但创建一个非常简单:

 public static double Evaluate(string expression) { System.Data.DataTable table = new System.Data.DataTable(); table.Columns.Add("expression", string.Empty.GetType(), expression); System.Data.DataRow row = table.NewRow(); table.Rows.Add(row); return double.Parse((string)row["expression"]); } 

现在简单地称它为:

 Console.WriteLine(Evaluate("9 + 5")); 

您可以使用DataTable类的“Compute”方法轻松完成此操作。

 static Double Eval(String expression) { System.Data.DataTable table = new System.Data.DataTable(); return Convert.ToDouble(table.Compute(expression, String.Empty)); } 

将字符串forms的术语传递给函数以获得结果。

 Double result = Eval("7 * 6"); result = Eval("17 + 4"); ... 

您可以使用CodeDom自己创建一个。 它会很慢,因为每次调用Eval时它都会创建一个新的程序集。

 public class Program { static void Main(string[] args) { Console.WriteLine(ExpressionEvaluator.Eval("(2 + 2) * 2")); } } public class ExpressionEvaluator { public static double Eval(string expression) { CSharpCodeProvider codeProvider = new CSharpCodeProvider(); CompilerResults results = codeProvider .CompileAssemblyFromSource(new CompilerParameters(), new string[] { string.Format(@" namespace MyAssembly {{ public class Evaluator {{ public double Eval() {{ return {0}; }} }} }} ",expression) }); Assembly assembly = results.CompiledAssembly; dynamic evaluator = Activator.CreateInstance(assembly.GetType("MyAssembly.Evaluator")); return evaluator.Eval(); } } 

可以使用System.Reflection.Emit或System.CodeDom命名空间,但这并不是一个好主意,因为没有机制来控制哪些命名空间是不允许使用的。 你编写了一个期望简单表达式的eval(),接下来你知道用户正在起诉你,因为你的代码允许他们输入一个擦除硬盘的字符串。 eval()的函数是巨大的安全漏洞,应该避免。

.Net世界中的首选替代方案是DSL(特定于域的语言) 。 如果您在谷歌周围,您可以找到一些预先创建的DSL用于常见任务,如算术。

没有本机C#eval函数; 但正如其他人之前所说,有几种解决方法可以解决您的问题。

如果您对评估更复杂的C#代码感兴趣,我的C#eval程序提供了在运行时评估C#代码并支持许多C#语句。 实际上,此代码可在任何.NET项目中使用,但是,它仅限于使用C#语法。 有关其他详细信息,请访问我的网站http://csharp-eval.com 。