Анализ и выполнение формул с помощью С#
Я ищу библиотеку с открытым исходным кодом для анализа и выполнения формулы/функций в С#.
Я хотел бы создать кучу объектов, которые вытекают из интерфейса (например, IFormulaEntity), который имел бы свойства/методы/значения и позволял бы пользователю указывать формулы для этих объектов.
Например, у меня может быть
public class Employee : IForumulaEntity
{
public double Salary { get; set; }
public void SendMessage(string message)
}
Затем разрешите пользователю приложения написать что-то вроде:
Employee person = <get from datasource>
if (person.Salary > 1000)
person.Salary += 1000;
person.SendMessage("Hello");
Это "похоже на С#", но это был бы упрощенный язык программирования. Я знаю, что это много, чтобы спросить. Я бы ожидал, что мои пользователи будут иметь разумные возможности (т.е. Могут писать собственные формулы Excel).
Ответы
Ответ 1
Посмотрите на функциональность модуля правил, которая является частью Windows Workflow Foundation.
Это не место, о котором можно было бы подумать. Однако, как часть работы, которую они сделали для создания пользовательского интерфейса, который позволяет разработчику Workflow использовать настраиваемые правила и выражения, они придумали способ сделать то же самое в своем собственном приложении, даже если вы не используете Workflow вообще. Их документация включает примеры размещения этой функции в приложении Windows Forms.
Ответ 2
Я использовал ANTLR, FSLEX/FSYACC и Managed Babel. Все делают то, о чем вы просите, и пока все бесплатны, только первый - это открытый исходный код.
Antlr: http://antlr.org/
FSLEX: http://www.strangelights.com/fsharp/wiki/default.aspx/FSharpWiki/fslex.html
Управляемый Вавилон: http://msdn.microsoft.com/en-us/library/bb165963.aspx
Ответ 3
Вы можете использовать cs- script. Это позволяет вам выполнять код С#, который, возможно, больше, чем вы хотите, но почему бы не просто придерживаться С# вместо создания своего собственного синтаксиса С#. Можно интегрировать cs- script в ваше приложение как DLL, и вы можете разрешить ему выполнять код С#, который не является частью класса, чтобы пользователи могли просто написать несколько инструкций, которые им нужны.
Ответ 4
Spring выражения являются очень мощными и меньше всего или ничего, кроме, например, WF
(Механизм основан на ANTLR, а бит выражения, в то время как он тянет в приличную размерную библиотеку lib, не выполняет во всех Spring.NET)
Ответ 5
Пока я избиваю это, Dynamic LINQ воспроизводится в этом пространстве (в частности, синтаксис С#). Очевидно, будьте осторожны, чтобы в вашем контексте поддерживались требования (эмиссия/компиляция кода).