将 String 用于 IF 语句条件
Use String for IF statement conditions
我希望有人可以帮助回答我的问题,也许可以知道去哪里或者我想做的事情是否无法以我想要的方式实现。
有人要求我根据 ERP
表单组件或变量所持有的数据编写一组 规则 。
不幸的是,无法在 ERP
之外访问或使用这些组件和变量,因此我无法使用 SQL
查询值然后构建某种 SQL
查询。
他们希望能够发表这样的声明:
C(MyComponentName) = C(MyOtherComponentName)
V(MyVariableName) > 16
(C(MyComponentName) = "") AND V(MyVariableName) <> "")
((C(MyComponentName) = "") OR C(MyOtherComponentName) = "") AND V(MyVariableName) <> "")
这应该变成某种查询,它获取 MyComponentName
和 MyOtherComponentName
的值并(在本例中)比较它们是否相等。
他们不一定只想比较是否相等,而是能够确定 component / variable
值是大于还是小于等。
基本上它是一个自由格式的语句,可以转换成类似于 IF
语句的形式。
我试过这个:
Sub TestCondition()
Dim Condition as string = String.Format("{0} = {1}", _
Component("MyComponent").Value, Component("MyOtherComponent").Value)
If (Condition) Then
' Do Something
Else
' Do Something Else
End If
End Sub
显然,这行不通,老实说我没想到会这么简单。
忽略我必须解析该行的事实,提取所需的运算符、组件或变量的值(用 C 或 V 表示)- 我该怎么做?
我看过表达式树,但它们令人困惑,尤其是我从未听说过它们,更不用说使用它们了。 (Is it possible to create an expression tree for dynamic if statements? - 此 link 提供了有关 C# 中表达式树的一些详细信息)
我知道解决这个问题的一种更简单的方法可能是简单地用大量下拉列表填充表单,这样用户就可以从列表中选择他们想要的内容或填写特定搜索条件的文本框。
这不是一件简单的事情,因为 ERP
不允许您在其表单上动态创建控件。您必须手动拖动每个组件,这几乎是无用的,因为我们可能希望我们拥有的每个表单 (100+) 至少有 1 rule
。
我要么在找人说 你不能按照你想要的方式做这件事(有一个合适的理由或关于我如何做的建议)我可以告诉我的经理或一些提示,也许 link 或 2 会给我指明正确的方向。
If (Condition) Then
这是不可能的。无法将存储在字符串中的数据视为代码。虽然上述声明是有效的,但它不会也不能按照您希望的方式运行。相反,Condition
将被评估为它是什么:一个字符串。 (任何不归结为 0 的都被视为 True;参见 this question。)
您正在尝试允许用户动态键入代码以获得结果。我不会说这在 VB.Net 本身是不可能的,但它非常雄心勃勃。
相反,我建议明确定义您的应用程序可以做什么和不能做什么。枚举您的代码将允许的运算符并构建代码以直接支持每个运算符。例如:
Public Function TestCondition(value1 As Object, value2 As Object, op as string) As Boolean
Select Case op
Case "="
Return value1 = value2
Case "<"
Return value1 < value2
Case ">"
Return value1 > value2
Case Else
'Error handling
End Select
End Function
显然,您需要根据要处理的变量类型和其他特定需求调整上述方法,但这种方法应该能为您提供可行的解决方案。
对于我的特殊要求,使用 NCalc 库使我能够完成大部分我想做的事情。易于使用且文档非常广泛 - 还有很多示例。
我希望有人可以帮助回答我的问题,也许可以知道去哪里或者我想做的事情是否无法以我想要的方式实现。
有人要求我根据 ERP
表单组件或变量所持有的数据编写一组 规则 。
不幸的是,无法在 ERP
之外访问或使用这些组件和变量,因此我无法使用 SQL
查询值然后构建某种 SQL
查询。
他们希望能够发表这样的声明:
C(MyComponentName) = C(MyOtherComponentName)
V(MyVariableName) > 16
(C(MyComponentName) = "") AND V(MyVariableName) <> "")
((C(MyComponentName) = "") OR C(MyOtherComponentName) = "") AND V(MyVariableName) <> "")
这应该变成某种查询,它获取 MyComponentName
和 MyOtherComponentName
的值并(在本例中)比较它们是否相等。
他们不一定只想比较是否相等,而是能够确定 component / variable
值是大于还是小于等。
基本上它是一个自由格式的语句,可以转换成类似于 IF
语句的形式。
我试过这个:
Sub TestCondition()
Dim Condition as string = String.Format("{0} = {1}", _
Component("MyComponent").Value, Component("MyOtherComponent").Value)
If (Condition) Then
' Do Something
Else
' Do Something Else
End If
End Sub
显然,这行不通,老实说我没想到会这么简单。
忽略我必须解析该行的事实,提取所需的运算符、组件或变量的值(用 C 或 V 表示)- 我该怎么做?
我看过表达式树,但它们令人困惑,尤其是我从未听说过它们,更不用说使用它们了。 (Is it possible to create an expression tree for dynamic if statements? - 此 link 提供了有关 C# 中表达式树的一些详细信息)
我知道解决这个问题的一种更简单的方法可能是简单地用大量下拉列表填充表单,这样用户就可以从列表中选择他们想要的内容或填写特定搜索条件的文本框。
这不是一件简单的事情,因为 ERP
不允许您在其表单上动态创建控件。您必须手动拖动每个组件,这几乎是无用的,因为我们可能希望我们拥有的每个表单 (100+) 至少有 1 rule
。
我要么在找人说 你不能按照你想要的方式做这件事(有一个合适的理由或关于我如何做的建议)我可以告诉我的经理或一些提示,也许 link 或 2 会给我指明正确的方向。
If (Condition) Then
这是不可能的。无法将存储在字符串中的数据视为代码。虽然上述声明是有效的,但它不会也不能按照您希望的方式运行。相反,Condition
将被评估为它是什么:一个字符串。 (任何不归结为 0 的都被视为 True;参见 this question。)
您正在尝试允许用户动态键入代码以获得结果。我不会说这在 VB.Net 本身是不可能的,但它非常雄心勃勃。
相反,我建议明确定义您的应用程序可以做什么和不能做什么。枚举您的代码将允许的运算符并构建代码以直接支持每个运算符。例如:
Public Function TestCondition(value1 As Object, value2 As Object, op as string) As Boolean
Select Case op
Case "="
Return value1 = value2
Case "<"
Return value1 < value2
Case ">"
Return value1 > value2
Case Else
'Error handling
End Select
End Function
显然,您需要根据要处理的变量类型和其他特定需求调整上述方法,但这种方法应该能为您提供可行的解决方案。
对于我的特殊要求,使用 NCalc 库使我能够完成大部分我想做的事情。易于使用且文档非常广泛 - 还有很多示例。