Я не уверен, что это в полной мере относится к тому, что вы пытаетесь выполнить, но всякий раз, когда мы сталкиваемся с этим типом «веселья», мы заканчиваем тем, что предоставляем бизнес-пользователям пользовательский интерфейс для определения их правил, а затем просто пишем достаточно код для применения правил к конкретным объектам.
Например, в одном из наших приложений мы позволяем пользователю указывать набор условий, которые, когда оцениваются как истинные, будут создавать пользовательский вывод.
Для этого мы сохраняем одну запись в базе данных для каждой части оператора IF. В каждой записи указывается имя свойства в классе, действие сравнения (<, =, <> и т. Д.), Значение сравнения, независимо от того, начинается или заканчивается ли оператор группа (т. Е. Parens), и как присоединяется текущий оператор. со следующим (И или ИЛИ).
Так что вы бы
Heading Record (Parent record, which defines the heading to be used)
Heading Selector (Child records which define the if statement)
Мы также можем поддерживать определяемые пользователем приоритеты в родительской записи, так что если у данной записи есть несколько совпадений, пользователь должен определить наилучшее совпадение посредством правильного применения приоритетов.
Во время выполнения вы просто создаете оператор для оценки условий, введенных пользователем. Мы используем отражение, чтобы нам не приходилось жестко кодировать имена свойств.
Кроме того, тот же код конфигурации можно использовать для генерации операторов SQL в тех случаях, когда более целесообразно выполнять логику выбора в SQL.
Мы широко использовали этот механизм и обнаружили, что он является очень мощным подходом к удовлетворению частых и разнообразных требований наших клиентов.