在C#中是否有eval函数?

时间:2011-05-19 00:50:34

标签: c# math eval

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

7 个答案:

答案 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");