VB:在条件中按名称引用变量

时间:2015-12-09 01:54:34

标签: vb.net

我是业余程序员,与朋友合作,无法找到解决我们编码困境的方法。

我们需要能够比较变量是否匹配在第二个变量中找到的数据,但是要搜索的第一个变量将依赖于第三个变量的内容。 (第三个变量将命名要搜索的第一个变量)

Var1, Var2, Var3 ... Var100 'Each with their own values and datatypes;
Var45 = 25
Vartocheck1 = "Var45"
Vattocheck2 = 25
If Vartocheck1 = Vartocheck2 Then
(Stuff)
End If

基本上,我想知道是否有一种比较两个变量的好方法,很可能是在If-then语句中,其中两个变量之一由第三个变量的内容决定。

这个想法是Vartocheck1将是一个字符串,包含变量的名称,其值我要检查Vartocheck2。问题是代码中的变量(在我的例子中:Var1,Var2,Var3 ...... Var100)被定义为流程运行,但外部excel图表在被引用时可以在程序期间更改某些变量'执行。我可以用大约一百万个嵌套的if-then语句完成我需要的东西,但这很慢而且很混乱,我希望还有另一种方法。

我已经研究过数组,但实现数组的大量数量和大小将是令人生畏的,需要整个项目重写。

有没有比较像这样的变量的好方法?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是一种称为反射的概念。这个SO问题解释了它:

How to get the variable names types, and values in the current class or Method in VB.net?

基于此,我已经快速创建了以下类:

Public Class Class1


Public This As String
Public That As Boolean

Public Function ListVar() As Boolean


    Dim fields As System.Reflection.FieldInfo() = Me.GetType().GetFields()

    For Each fld As System.Reflection.FieldInfo In fields
        Dim name As String = fld.Name
        Dim value = fld.GetValue(Me)
        Dim typ As Type = fld.FieldType
        Debug.Print(name)
    Next
    Return True
End Function
End Class

您可以通过以下方式从任何地方调用ListVar函数:

Dim c As New Class1
c.ListVar()

显然这不是生产准备,但应该给你一个开始。

答案 1 :(得分:0)

虽然我仍然认为这是一个XY问题,但.net中的一个方便容器是a dictionary。这允许您存储可以是任何类型的键值对。这为您提供了一些数据库获得的工具(在这种情况下可能是更好的解决方案)。例如:

Imports System.Collections.Generic    
Module Module1
    Dim ValueDict As New Dictionary(Of String, Integer)    
    Sub Main()
        Dim r As New Random
        'Fill the dictionary with keys "Var1" -> "Var100"
        'Fill the values with random integers
        For i As Integer = 1 To 100
            ValueDict.Add("Var" & i.ToString, r.Next)
        Next

        'Extract a variable by name
        Dim extractedVar As Integer
        If ValueDict.TryGetValue("Var23", extractedVar) Then
            Console.WriteLine("Var23 has value :" & extractedVar.ToString())
        Else
            Console.WriteLine("Var23 does not exist in the dictionary")
        End If

        'enumerate all values
        For Each valuePair As KeyValuePair(Of String, Integer) In ValueDict
            Console.WriteLine("Variable " & valuePair.Key & _
                              " = " & valuePair.Value.ToString())
        Next

        'Get a variable by number
        Dim varNumber As Integer = 72
        If ValueDict.TryGetValue("Var" & varNumber.ToString(), extractedVar) Then
            Console.WriteLine("Var" & varNumber.ToString() & _
                              " has value :" & extractedVar.ToString())
        Else
            Console.WriteLine("Var" & varNumber.ToString() & _
                              " does not exist in the dictionary")
        End If    
        Console.ReadLine()
    End Sub    
End Module

其他类型的操作:

        'Check if value exists, Assign a new value or update an existing value
        Dim newVal As Integer = 12345
        Dim varName As String = "Var147"
        If Not ValueDict.ContainsKey(varName) Then
            Console.WriteLine(varName & " does not currently exist")
        End If
        ValueDict.Item(varName) = newVal
        Console.WriteLine(varName & " now has value :" & ValueDict.Item(varName).ToString())

        'Delete a value
        ValueDict.Remove(varName)
        If Not ValueDict.ContainsKey(varName) Then
            Console.WriteLine(varName & " does not currently exist")
        End If