Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

eval в С#

16K
01 июня 2006 года
qad
5 / / 24.05.2006
Вопрос прост. Как воспользоватся функцией eval из javascript или каким-то ее аналогом в С#. Просто нужно вычислить значение строки а нечем.
273
01 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
Цитата:
Originally posted by qad
Вопрос прост. Как воспользоватся функцией eval из javascript или каким-то ее аналогом в С#. Просто нужно вычислить значение строки а нечем.


1) Если заGooglится, то можно найти следующее:
http://www.valley.ru/~dmoiseev/evaluatorru.html
Исходник правда на C++, переправить на C# не сложно.
2) Можно использовать JScript. Ведь там он есть!

 
Код:
using Microsoft.JScript;
int result=(int)GlobalObject.eval("2+2");


Можно ещё так:
using Microsoft.JScript;
using Microsoft.Vsa;
int result = (int) Eval.JScriptEvaluate("5+2", Vsa.VsaEngine.CreateEngine())

3) Другой выход заключается в том, чтобы заюзать CodeDOM, т.е. динамическу генерацию кода.
Код:
using System;
using System.CodeDom;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;

class Program
{
  [STAThread]
  static void Main(string[] args)
  {
    string e="2+sin(77/3.1415)/0.271";
    Console.WriteLine("{0} = {1}", expression1, Evaluator(expression1));
  }

  static double Evaluator(string expression)
  {
    // компилятор кода C#
    ICodeCompiler       cs=(new CSharpCodeProvider().CreateCompiler());
    // параметры компиляции: DLL в памяти
    CompilerParameters  cp=new CompilerParameters();
    cp.ReferencedAssemblies.Add("system.dll");
    cp.GenerateExecutable =false; // создать DLL
    cp.GenerateInMemory   =true;  // создать в памяти
       
    // текст программы на C#:
    string code=string.Empty;
    code+="using System;";
    code+="{ public class Evaluate";
    code+="  { public  double GetResult(){ return(\r\n"+expression+"\r\n); }";
    code+="    private double sin(double x){ return(Math.Sin(x)); }";
    code+="    private double cos(double x){ return(Math.Cos(x)); }";
    code+="  }";
    code+="}";
   
    // компиляция исходного кода и получение сборки
    CompilerResults cr=cs.CompileAssemblyFromSource(cp, code);
    if(cr.Errors!=null && cr.Errors.Count>0) // ? ошибки
    { for(int i=0; i<cr.Errors.Count; i++)
    Console.WriteLine("Col {0} - {1}", cr.Errors.Column, cr.Errors.ErrorText);
      return(0.0);
    }
   
    try // создать объект и вызвать метод для вычисления выражения
    { object ob=cr.CompiledAssembly.CreateInstance("Evaluate");
      return((double)ob.GetType().InvokeMember("GetResult", BindingFlags.InvokeMethod, null, ob, new object[]{}));
    }
    catch(Exception ex){ Console.WriteLine(ex.Message); return(0.0); }
  }
}

Если развить идею, то можно состряпать интерпретатор арифметич. выражений.
273
01 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
Ещё можешь на codeproject.com посмотреть
16K
02 июня 2006 года
qad
5 / / 24.05.2006
Цитата:
Originally posted by 3A3-968M
Ещё можешь на codeproject.com посмотреть


Во втором случае я не могу вызывать Math методы. А при первом выскакивают exception "Eval may not be called via an alias".

273
04 июня 2006 года
3A3-968M
1.2K / / 22.12.2005
Сделать аналогичный eval в C# не получится, т.к. приложения .NET не интерпретируются. Можно замутить через CodeDOM, в аттаче лежит примерчик. Пример позволяет использовать math функции sin и cos. Там же написано, как можно расширить для дургих функций.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог