Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Подобие eval


Автор: Валерия 23.10.2007, 22:56
Код

string test="x = 5;";
int x;
x = 10;
eval(test); //такого не существует
Console.Write(x); //вот тут нужно что бы вывело 5


Так вот, eval точно нет, но есть ли какоето подобие eval в C# как у php или javascript?

Автор: archeg 24.10.2007, 00:54
Можно через System.Reflection.Emit, только оно не так красочно будет выглядеть smile
А зачем такое нужно?

П.С. Как вариант использовать CodeDOM - только код в таком случае есть оддельная сборка(поэтому доступ к даным немного сложнее. Вот пример:
Код

 CodeDomProvider provider = new CSharpCodeProvider();
            string[] strings = new string[]{ // Код который нужно динамически генерировать и запускать. Сопств. можно посчитать любое выражение :)
                @"using System; using System.Windows.Forms;
                class Program { public static void Main() {
                System.Windows.Forms.MessageBox.Show((2+2).ToString()); 
                }}"};
            CompilerParameters param = new CompilerParameters();
            param.MainClass = "Program";
            param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            CompilerResults result = provider.CompileAssemblyFromSource(param, strings);
            if (result.Errors.Count != 0)
            {
                foreach (CompilerError err in result.Errors)
                {
                    Console.WriteLine(err.ErrorText);
                }
                Console.ReadLine();
                return;
            }

            Type cl = result.CompiledAssembly.GetType("Program");
         
            MethodInfo mi = cl.GetMethod("Main");
            mi.Invoke(null, null);

Автор: Валерия 25.10.2007, 14:45
А можно пример с System.Reflection.Emit ?

З.Ы нужно что бы графики вводить не в исходнике а в форме.

Автор: marcusmae 27.10.2007, 17:36
Валерия, проблема в том, что C# (в отличие от php и jscript) не явялется интерпретируемым языком, соответственно, он не может динамически исполнять вновь прибывшие строчки кода.
Вариант, который предлагает archeg по сути состоит в том, что в дополнение к исполняющейся программе создаётся ещё один тип, а в нём - функция с кодом, получающимся, например, из Ваших текстовых строк. Эта функция компилируется в сборку, затем её можно вызывать из Вашей программы, например, через делегат.

В общем, технология весьма синтетическая. Я делал визуализатор на её основе (см. приложенный архив). Там так же двумерная функция, график которой надо построить, задавалась, как функция на языке C# прямо из формы.

Код очень похож на тот, что привёл archeg.

 

Автор: marcusmae 27.10.2007, 17:37
Например, функция

Код

using System;
public static class FunctionClass
{
    public static double Function(double x, double y)
    {
        //
        // TODO : Add plane function code here
        //
        return (x*x + y*y + 0.25)*(x*x + y*y + 0.25)-
            4*0.25*0.25*x*y;
    }
}


user posted image

Код

using System;
public static class FunctionClass
{
    public static double Function(double x, double y)
    {
        //
        // TODO : Add plane function code here
        //
        return -(x + y*y + 0.25)*(x*x + y + 0.25)-
            4*0.25*0.25*x*y;
    }
}


http://img13.imagevenue.com/img.php?image=96945_sample2_122_768lo.jpg

Вторая часть архива :

Автор: Валерия 30.11.2007, 15:17
Мне нужно что бы я мог ввести в текстовое поле скажем
(2*Math.Sin(a))/5
и что бы когда клацнул на OK что бы график нарисовало
Собственно моя прога графики рисует, только эту строчку в самой проге нужно вводить smile
Есть ли еще какието способы, или готовые анализаторы строк, желательно попроще, что бы только +-*/ sin cos tg ctg

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)