C # - я могу определить функцию на лету из предоставленной пользователем формулы строки? - PullRequest
2 голосов
/ 23 марта 2011

Я могу определить функцию с лямбда-выражением, как в:

Func <int, int, int> Fxy = ( (a,b) => a + b ) );  // Fxy does addition

Но что, если я хочу разрешить пользователю указывать r.h.s. лямбда-выражения во время выполнения?

String formula_rhs = Console.Readline();
// user enters "a - b"

Могу ли я как-то изменить Fxy, как если бы я кодировал

Func <int, int, int> Fxy = ( (a,b) => a - b ) );  // Fxy does what the user wants 
                                                  // (subtraction)

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

Ответы [ 5 ]

1 голос
/ 23 марта 2011

Попробуйте ncalc framework: http://ncalc.codeplex.com/ Его легкий и легкий.

0 голосов
/ 28 марта 2011

Использование Linq.Expressions может быть идеей здесь.

Ваш пример будет переведен на:

var a = Expression.Parameter(typeof(int), "a");
var b = Expression.Parameter(typeof(int), "b");
var sum = Expression.Subtract(a, b);
var lamb = Expression.Lambda<Func<int, int, int>>(sum, a, b);
Func<int, int, int> Fxy = lamb.Compile();

Конечно, вы получите удовольствие от разбора строки в правильных выражениях. : -)

0 голосов
/ 28 марта 2011

Если вы планируете использовать несложные формулы, JScript engine будет простым решением:

        Microsoft.JScript.Vsa.VsaEngine engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
        MessageBox.Show(Microsoft.JScript.Eval.JScriptEvaluate("((2+3)*5)/2", engine).ToString());

Не забудьте добавить ссылку на Microsoft.JScript сборку

0 голосов
/ 28 марта 2011

Пространство имен System.Reflection.Emit предназначено для генерации кода на лету. В целом это довольно сложно, но может помочь для простых функций, таких как вычитание.

0 голосов
/ 23 марта 2011

Это не так просто. Эта библиотека содержит некоторые функции Dynamic Linq, которые можно использовать для преобразования лямбда-выражения из текста в Func <>, посмотрите на него.

...