我有Questions数据表,其中带有Question_Id,值,启用列。这将加载带有答案的问题列表。
将基于Questions数据表创建UI控件,其中Question已将enable设置为true。如果用户选择/更改任何问题的答案,则该值将在问题表中更新,结果将启用/禁用其他相关问题(如果有)。
这将在一个表达式中定义,基本上是“如果Y ==(someValue)AND / OR .....,则启用X,这里X,Y是问题。
我想在Linq.Expression中使用表达式树来处理此问题,但是这对于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
中将简单的逻辑语句存储为字符串或多列并对其进行解析),然后将条件语句定义转换为表达式树。这可能非常简单或复杂,具体取决于您希望决策树变得多么复杂。关于c# - 在DataTable上构建表达式,有设计建议吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8999195/