假设我想使用If语句,但直到运行时才知道If语句的实际条件是什么。有没有办法通过将条件作为字符串的内容传递?作为我希望实现的那种事情的一个例子,请考虑以下代码;
Dim a as Integer = 1
Dim b as Integer = 2
Dim ConditionString As String = "<"
If a ConditionString b Then
...
End If
我正在寻找的主要方法是将实际条件保持不变,直到运行时。我想这样做的原因是因为我需要在数据库中有一组阈值条件,不仅包括数值本身,还包括比较操作。我可能想要一些相当于&#34;&gt; 3.2和&lt; 5.6&#34 ;.当数字从数据中提取时,需要根据各种条件将比较操作应用于数据。此外,数据库将不时更改。
答案 0 :(得分:2)
对于这种情况,我喜欢使用NCalc
库,它拥有你需要的一切 - 它解析简单的表达式(包括逻辑和关系)。以下是C#中的一个示例:
var expr = new Expression("[X] > 3.2 and [X] < 5.6");
expr.Parameters["X"] = 10.0;
if (expr.Evaluate())
{
// ...
}
和VB.NET:
Dim expr As var = New Expression("[X] > 3.2 and [X] < 5.6")
expr.Parameters("X") = 10
If expr.Evaluate Then
' ...
End If
答案 1 :(得分:1)
您可以存储String
至Func(Of Integer, Integer, Boolean)
的地图,其中包含字符串&#34;&lt;&#34;,&#34;&gt;&#34;,&#34; ==&#34;等等,并获取实现这些条件的函数的地址。例如:
Function LessThan(Integer a, Integer b) As Boolean
Return a < b
End Function
Dim Comparisons As New Map(Of String, Func(Of Integer, Integer, Boolean))
Comparisons.Add("<", AddressOf LessThan)
然后你可以这样称呼它:
Dim a as Integer = 1
Dim b as Integer = 2
Dim ConditionString As String = "<"
If Comparisons(ConditionString)(a, b) Then
答案 2 :(得分:0)
只有几个可能的条件,所以我只使用Select..Case语句:
Select Case ConditionString
Case "<"
Case ">"
'etc.
Case Else
End Select
否则,您不能(简单地)转换字符串&#34;&lt;&#34;给运营商。
答案 3 :(得分:0)
你只需要一个'代码',将你可以存储在数据库中的某种值映射到你想要测试的各种“条件”。我建议使用enum:
而不是字符串Enum ConditionEnum
LessThan
GreaterThan
Equal
SomeOtherVeryComplicatedBinaryFunction
End Enum
然后定义一个方法来评估条件以及两个参数:
Public Sub EvaluateConditionWithArguments(ConditionEnum condition, Integer a, Integer b) As Boolean
EvaluateConditionWithArguments = False
Select Case condition
Case ConditionEnum.LessThan
If a < b Then
EvaluateConditionWithArguments = True
End If
...
End Select
End Sub