Если я правильно понимаю вопрос, вы строите список вопросов, который должен динамически обновляться на основе ответов на эти вопросы. Например, если ответ на вопрос № 1, то вопрос № 2 должен быть отключен (или что-то более сложное).
Я большой поклонник динамической генерации кода (например, деревьев выражений), но на самом деле это можно решить проще с помощью структуры XML, так как она позволяет представлять отношения гораздо лучше, чем один DataTable
.
<question id="1">
<if valueToCompare="Foo" operator="EqualTo">
<disable questionId="5" />
<removeOption questionId="6" optionId="2" />
</if>
</question>
Всякий раз, когда меняется ответ пользователя на вопрос, просто посмотрите на соответствующий узел XML и действуйте соответствующим образом.
Вы можете оценивать и перестраивать свои элементы управления в режиме реального времени без необходимости скомпилированных выражений, и производительность будет хорошей, если у вас нет чрезвычайно сложных элементов управления.
Однако, если вы хотите узнать о выражениях, вы, безусловно, можете экстраполировать и конструировать их из структуры XML и создавать делегаты, которые вызываются при изменении вопроса. Например, если ответ на вопрос № 1 должен отключить вопрос № 2, вы можете превратить эту логику в делегат, который запускается при изменении вопроса № 1.
Это потребует первоначального анализа вашего источника данных (XML или иным способом - вы, безусловно, можете хранить простые логические операторы в DataTable
в виде строк или нескольких столбцов и анализировать их) и превращать определения условных операторов в деревья выражений. Это может быть довольно просто или сложно в зависимости от того, насколько сложным вы хотите, чтобы ваши деревья решений были.