Вопрос

вопрос, возможно, сложный, позвольте мне его расширить:

  • существует ли оно дизайнер (заглушка/фреймворк/мета-дизайнер) для создания правил на основе И/ИЛИ на основе общедоступных логических свойств объекта .NET?Сохраняется как любой DSL/Boo/...выход.
  • можно ли скомпилировать Вывод DSL в C# выражения?

Наша главная проблема — это разрыв между документацией и кодом.Наш продукт основан на сотнях правил, определяемых пользователями, и мы хотим ускорить обработку запросов на изменения.

Если мы сможем предоставить пользователям простой конструктор и получить выходные данные, то после трансляции/компиляции его в код C#/IL у нас будет цикл быстрого запроса на изменение.

Я знаю, что наша проблема специфична, но любые "кирпичи в стене" приветствуются!

Пример:

Класс C#, предмет:

public class TestA
{
     public bool B {...}
     public bool C {...}
}

В дизайнере мы должны иметь возможность создавать

  • любой тип графических дизайнеров (т.раскрывающийся список для выбора общедоступных свойств)

Вывод в DSL:

If TestA.B AND TestA.C Then Return True;

Вывод на С#:

if (testA.B && testA.C) { return true; }

Обновление №1

Я был бы рад языку DSL, поддерживающему использование статически типизированных классов .NET.Я имею в виду, может ли пользователь проверить код («Вывод в DSL» в примере), дизайнер нам не нужен.

Обновление №2

Судя по подсказке, я смотрел на деревья выражений.Через несколько дней я столкнулся с DLinq — я никогда не был большим поклонником DLinq, но в данном случае он очень хорошо подходит для проблемной области.

  • Легко разобрать (A > 2 И B < 4) ИЛИ C = 5 в деревья выражений
  • Легко создавать такие выражения
  • Очень легко сериализовать/десериализовать
  • Графический интерфейс на основе FlowLayoutPanel отлично работает как «построитель выражений».
Это было полезно?

Решение

Вы можете построить что-то подобное самостоятельно.

Вы можете получить список всех общедоступных свойств класса, используя Type.GetMembers().

Однако вместо генерации кода C# я бы использовал деревья выражений.

Таким образом, вам не нужно задействовать компилятор C#, когда пользователи меняют правила.Вместо этого вы можете сохранить правила в базе данных, загрузить их во время выполнения, а затем использовать метод Expression.Compile() для создания делегата, который можно вызвать для запуска кода.

Обновлять:

В комментариях кто-то спросил: «В чем разница между Expression Tress и доменно-ориентированными языками?»

Вот ответ:

Деревья выражений и предметно-ориентированные языки — вещи ортогональные.

Expression tress — это просто API для представления выражений C#, который можно удобно динамически преобразовать в делегат во время выполнения.

DSL, или предметно-ориентированный язык, — это язык программирования, предназначенный для решения узкого класса задач.

Это, по сути, совершенно разные вещи.

Если хотите, вы можете использовать деревья выражений как часть реализации DSL.Linq использует их для этой цели.

Однако в вашем случае вам не нужен DSL.Что вам нужно, так это пользовательский интерфейс, который генерирует правила (аналогично тому, как работает Outlook), а затем способ выполнения этих правил.

Создание пользовательского интерфейса — это обычная разработка пользовательского интерфейса.

Деревья выражений — это то, что вы можете использовать для реализации правил.

Другие советы

Малоизвестный факт, что конструктор Windows Workflow Foundation и его обработчик правил, в частности, можно разместить в приложении Windows Forms отдельно от Visual Studio.Созданные таким образом правила можно аналогичным образом оценивать независимо от реального рабочего процесса.

Видеть Руководство по сценариям WF:Повторный хостинг Workflow Designer и Руководство:Хостинг WF Designer.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top