在DataTable上生成表达式,设计建议
本文关键字:表达式 DataTable | 更新日期: 2023-09-27 18:21:16
我有一个Questions数据表,其中有Question_Id、value和enable列。这将加载带有答案的问题列表。
UI控件将基于Questions数据表创建,其中question has enable设置为true。如果用户选择/更改任何问题的答案,问题表中的值将更新,结果是启用/禁用其他相关问题(如果有)。
这将在一个表达式中定义,基本上是"Enable X,if Y==(someValue)AND/OR….."这里X、Y是问题。
我想在Linq.Expression中使用表达式树来处理这个问题,但对表达式求值来说是新的,我正在寻找一种好的设计方法来实现。
有人能指导我吗?
如果我正确理解了这个问题,那么您正在构建一个问题列表,该列表应该根据这些问题的答案进行动态更新。例如,如果问题#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
中作为字符串或多列并进行解析),然后将条件语句定义转换为表达式树。这可能很简单,也可能很复杂,这取决于您希望决策树的复杂程度。