2012-07-18 86 views
3

我知道我不能动态引用一个变量(例如'var & var.Close()')。 我可以以某种方式有一个变量,可以通过名称指向另一个变量?VB.NET参考/指向一个变量

我当前的代码是(其中FUNC()需要一个数组):

Dim playerNum As String = “P1” 
Select Case playerNum 
    Case “P1” 
    Func(P1(x, xx)) 
    Case “P2” 
    Func(P2(x, xx)) 
    ......... 
End Select 

可以沿着这些路线的东西做什么?

Dim playerNum As varNameRef = P1(,) 
Func(playerNum(x, xx)) 

真的什么东西停止这么多的重复将不胜感激。 干杯。

+2

为此,您可以使用反射,但除非你有上百个这样的方法的可读性/可维护性成本不会是值得的。 – 2012-07-18 12:47:56

+0

[在VB.NET中存储字符串中的变量名称]的可能重复(http://stackoverflow.com/questions/353131/store-variable-name-in-string-in-vb-net) – 2012-07-18 13:00:10

+0

感谢您的回复。我会听取你的意见 - 我只有20个案例。 – 2012-07-18 13:00:38

回答

1

你需要的是一个引用类型(类),而不是值类型(结构)。举例来说,如果你创建了一个存储在您的数组作为一个属性,像这样一类:

Public Class PlayerData 
    Public Data(10, 30) As Object 
End Class 

这也为您提供了轻松扩大你存储每个球员的数据的优势。然后,你可以参考同一PlayerData对象多变量:

Dim player1 As New PlayerData() 
Dim player2 As New PlayerData() 
Dim player As PlayerData = Nothing 
Select Case playerNum 
    Case “P1” 
     player = player1 
    Case “P2” 
     player = player2 
End Select 
Func(player.Data(x, xx)) 

但是,它甚至会更好,但将它们存储在字典中的键值对,如:

Dim players As New Dictionary(Of String, PlayerData)() 
players("P1") = New PlayerData() 
players("P2") = New PlayerData() 

然后,你可以访问你的球员是这样的:

Func(players(playerNum).Data(x, xx)) 
+0

谢谢。这是我出错的地方。 – 2012-07-18 14:01:48

1

您可以通过反射来做到这一点,但我会建议不要考虑性能,可读性和可维护性的原因。

你可以使用Actions(Of T)如果你真的想要,例如:

Class Player 
    Public Name As String 
End Class 

Sub play(player As Player) 
    Console.WriteLine(player.Name & " plays now") 
End Sub 

创建一些球员证明:

Dim playerList As New List(Of Player) 
For i As Int32 = 1 To 10 
    Dim p = New Player() With {.Name = "P" & i} 
    playerList.Add(p) 
Next 

playerList.ForEach(AddressOf play)