В C # есть функция eval? - PullRequest
8 голосов
/ 19 мая 2011

Я набираю уравнение в textbox, которое будет генерировать график данной параболы. Можно ли использовать функцию eval? Мой C # 2010 не имеет microsoft.jscript.

Ответы [ 5 ]

24 голосов
/ 19 мая 2011

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"));
5 голосов
/ 14 августа 2014

Вы можете легко сделать это с помощью метода "Compute" класса DataTable.

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");
...
4 голосов
/ 13 апреля 2015

Вы можете создать его самостоятельно, используя 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();
    }
}
1 голос
/ 19 мая 2011

Это возможно с использованием пространств имен System.Reflection.Emit или System.CodeDom, но это не совсем хорошая идея, поскольку нет механизма для контроля того, что такое пространства имен и которые нельзя использовать.Вы пишете eval (), ожидая простых выражений, и следующее, что вы знаете, пользователь предъявляет вам иск, потому что ваш код позволил им ввести строку, которая стерла его жесткий диск.eval() -подобные функции - это огромные дыры в безопасности, и их следует избегать.

Предпочтительной альтернативой в мире .Net является DSL (предметно-ориентированный язык) .Если вы заглянете в Google, вы можете найти несколько предварительно созданных DSL для общих задач, таких как арифметика.

0 голосов
/ 10 июня 2011

Нет собственной функции C # eval;но, как ранее уже говорили другие, есть несколько обходных путей для того, что вы пытаетесь сделать.

Если вы заинтересованы в оценке более сложного кода на C #, моя программа на C # eval обеспечивает оценку кода на C # во время выполнения и поддерживаетмного утверждений C #.На самом деле этот код можно использовать в любом проекте .NET, однако он ограничен использованием синтаксиса C #.Загляните на мой сайт, http://csharp -eval.com , для получения дополнительной информации.

...