我在textbox
中键入一个方程式,它将生成给定抛物线的图形。是否可以使用eval函数?我的C#2010没有microsoft.jscript
。
答案 0 :(得分:24)
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"));
答案 1 :(得分:5)
您可以使用DataTable类的“Compute”方法轻松完成此操作。
static Double Eval(String expression)
{
System.Data.DataTable table = new System.Data.DataTable();
return Convert.ToDouble(table.Compute(expression, String.Empty));
}
将字符串形式的术语传递给函数以获得结果。
Double result = Eval("7 * 6");
result = Eval("17 + 4");
...
答案 2 :(得分: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();
}
}
答案 3 :(得分:1)
可以使用System.Reflection.Emit或System.CodeDom命名空间,但这并不是一个好主意,因为没有机制来控制哪些命名空间是不允许使用的。你编写了一个期望简单表达式的eval(),接下来你知道用户正在起诉你,因为你的代码允许他们输入一个擦除硬盘的字符串。 eval()
- 类似的功能是巨大的安全漏洞,应该避免。
.Net世界中的首选替代方案是DSL (domain specific language)。如果你在谷歌周围,你可以找到一些预先创建的DSL用于常见的任务,如算术。
答案 4 :(得分:0)
没有原生C#eval功能;但正如其他人之前所说,有几种解决方法可以解决您的问题。
如果您对评估更复杂的C#代码感兴趣,我的C#eval程序提供了在运行时评估C#代码并支持许多C#语句。实际上,此代码可在任何.NET项目中使用,但是,它仅限于使用C#语法。有关其他详细信息,请查看我的网站http://csharp-eval.com。
答案 5 :(得分:0)
非常感谢Teoman Soygul先生
如果您想捕获错误,则可以使用try catch,然后可以将该值用于将来的目的。
try
{
DataTable table = new System.Data.DataTable();
table.Columns.Add("expression", string.Empty.GetType(), expression);
DataRow row = table.NewRow();
table.Rows.Add(row);
return double.Parse((string)row["expression"]);
}
catch (Exception)
{
return -1;
}
答案 6 :(得分:0)
我受mar.k的回答启发创建了ExpressionEvaluatorCs Nuget软件包,并添加了用于指定返回类型的选项。
示例代码
// Returns object 6
object result1 = ExpressionEvaluator.Evaluate("(1 + 2) * 2");
// Returns int 6
int result1 = ExpressionEvaluator.Evaluate<int>("(1 + 2) * 2");