使用字符串变量的内容作为if语句的条件?

时间:2014-05-09 20:21:46

标签: vb.net

假设我想使用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 ;.当数字从数据中提取时,需要根据各种条件将比较操作应用于数据。此外,数据库将不时更改。

4 个答案:

答案 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)

您可以存储StringFunc(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