如何使用变量名来获取字符串部分

时间:2015-06-13 23:17:15

标签: .net vb.net string

我有一个用vb.net编写的程序,其中包含许多非常相似的变量。 例如,其中一个是

Public Shared iPhone4S_Firmware_8_0_Key = key

如您所见,我的变量由iPhone模型(iPhone 4S / 5等)和固件版本(8.0 / 8.0.1等)组成。 现在,当用户选择“设备”+“固件”的组合时,我的工具必须在另一个名为“活动”的字符串中输出正确的变量(取决于用户的选择)。

我可以使用if / then组合手动完成此操作,但这会很麻烦。所以我想以这种方式继续下去:

Dim active as String = iPhoneModel + "_Firmware" + version + "_Key"

您可以猜到,'iPhoneModel''version'是另外两个字符串。所以通过这种方式,我总能动态地组成正确的变量,但问题是如果我写

Dim active as String = iPhoneModel + "_Firmware" + version + "_Key"

它认为'iPhoneModel + "_Firmware" + version + "_Key"'是新变量的内容。 那么我怎么能说该程序必须从已存在的变量中获取该名称的内容;而不是将该名称作为变量的内容?

1 个答案:

答案 0 :(得分:6)

即使您知道字符串由子部分组成,编译器也无法知道如何将某些部分映射到“模型”而某些部分映射到“版本”等。

如果你有一个独立有意义的东西的不同部分,你可以使用一个非常简单的类来存储这些部分:

Public Class PhoneItem
    Public Property Brand As String
    Public Property Model As String

    ' Note that there is an actual Version Type in NET
    Public Property FirmwareVer As String

    Public Property ActivationKey As String
    Public Property IsActive As Boolean

    Public Sub New(b As String, md As String)
        Brand = b
        Model = md

        FirmwareVer = ""
        ActivationKey = ""
        IsActive = False
    End Sub

    ...
    Public Overrides Function ToString() As String
        Return String.Format("{0}.{1}", Brand, Model)
    End Function
End Class

创建新的PhoneItem

Dim pi As New PhoneItem("Nokia", "whizbang")
pi.FirmwareVer = "1.6.666"
pi.IsActive = SomeTest()
pi.ActivationKey = GetPhoneKey()

' create the string depending on what they choose,
' or perhaps create methods in the class to do it  
Dim thisPhone = pi.Brand & pi.Model & pi.FirmwareVer & pi.ActivationKey

该类的ToString()方法提供该电话项的默认字符串表示形式。在这种情况下,它将返回或打印“Nokia.whizbang”作为一种唯一标识符。它可能不是用户看到的东西,但代码可能有用。

如果有许多可能的手机品牌/型号,您可以将它们存储在字典中并使用Make.Model作为键(我们不知道数据的真实情况,但似乎应该是唯一的)。

' collection of PhoneItems:
Private mcolP As Dictionary(Of String, PhoneItem)
...
mcolP = New Dictionary(Of String, PhoneItem)
mcolP.Add(pi.ToString, pi)

只要您使用唯一键(第一个参数),就可以存储任意数量的PhoneItem个对象。要获得一个可以使用的集合:

Dim active As PhoneItem = mcolP("Samsung.FooBar")

另请注意,该集合可用于提供诸如Make和Model ComboBoxes的内容之类的内容,因此您不会复制数据。