Есть ли что-то похожее на jEval для C # / .net? - PullRequest
1 голос
/ 14 мая 2010

Я ищу язык, который довольно легко будет анализировать математические выражения для меня, но также сможет вызывать функции и ссылочные переменные по мере необходимости. Джевал выглядит как раз то, что я ищу, но, к сожалению, я работаю в C #. Есть ли .Net основанный эквивалент jeval?

Ответы [ 5 ]

3 голосов
/ 14 мая 2010

Для этого вы можете использовать язык DLR, например IronRuby. Вы можете выполнить (оценить) файл сценария из приложения C #.

2 голосов
/ 14 мая 2010

В C # 4.0 вам ничего не доступно напрямую. Ожидается, что в C # 5.0 вы это увидите, но сейчас это вам не поможет.

Существует альтернатива ... вы можете использовать Code DOM для компиляции некоторого кода на лету, а затем запустить его: Быстрый пример.

Есть, к сожалению, некоторые существенные недостатки этого подхода. Во-первых, это медленно. На современном компьютере сборка самого маленького фрагмента кода может занять до четверти секунды. Во-вторых, вы на самом деле создаете новую DLL, которая загружается каждый раз, когда вы делаете это. Если у вас есть система, которая любит выполнять динамический код, у вас будет куча динамически сгенерированных DLL в вашем рабочем пространстве. Чтобы это исправить, вы можете выполнить динамический код в отдельном Домене Приложения, но теперь вы начинаете очень усложняться.

Моя рекомендация: использовать встроенный язык сценариев, такой как IronRuby, и вместо этого генерировать код Ruby. Вы можете оценить встроенные языки сценариев значительно быстрее, чем подход, который я только что обрисовал.

0 голосов
/ 14 мая 2010

Есть простой способ сделать это, используя функцию JScript eval:

  • создайте исходный файл JScript, JsMath.js:

    class JsMath
    {
        static function Eval(expression : String) : double
        {
            return eval(expression);
        };
    }
    
  • скомпилируйте его в DLL:

    > jsc /t:library JsMath.js
    
  • в своем проекте C #, добавьте ссылку на JsMath.dll и вызовите метод JsMath.Eval:

    double x = JsMath.Eval("2 + 3 * 4");
    
0 голосов
/ 14 мая 2010

Если вам нравится JavaScript, взгляните на Jint , интерпретатор JS для .NET. Вместо компиляции кода и работы с доменами приложений Jint фактически реализует интерпретатор JS. Вы можете предоставлять переменные / методы из ваших классов .NET сценариям, а сценарии могут возвращать значения вашему приложению C #.

Определенно стоит проверить.

0 голосов
/ 14 мая 2010

Вы можете сделать это с помощью отражения. У меня нет деталей, но я использовал отражение, чтобы выполнить строку, содержащую имя объекта, который я хотел использовать.

...