2013-04-12 60 views
0

我有一個被稱爲 「Cheat_Enabled 」VAR:解析控制名義變量名

Dim Cheat_Enabled As Boolean 

而一個被稱爲「 CheckBox_Cheat」 與標籤 「作弊

複選框現在我想要做一個動態的方法來通過分割(或某種)控件的名稱來改變var的值。

例如,像這樣(代碼obviouslly不工作):

Private Sub CheckBoxes_CheckedChanged(sender As Object, e As EventArgs) Handles _ 
    CheckBox_Cheat.CheckedChanged 

    Dim SenderVarEquivalent As Object = _ 
    Me.variables.Find(sender.Tag & "_Enabled")(0) 

    If sender.Checked Then SenderVarEquivalent = True _ 
    Else SenderVarEquivalent = False 

End Sub 

    ' Info: 
    ' Sender.Tag = "Cheat" 
    ' Sender.Name = "CheckBox_Cheat" 
    ' VariableName = "Cheat_Enabled" 

我認爲這是可以用一個CTYPE或DirectCast或GetObject做,但我不知道究竟該怎麼辦它。

UPDATE:

這是一個類似簡單的代碼,但不是轉換控件名稱到VARIABLENAME它控制標籤轉換爲複選框的控件名稱對象:

Public Class Form1 

    Dim Cheat_Enabled As Boolean = True 

    Private Sub CheckBox_Cheat_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox_Cheat.CheckedChanged 
     CType(Controls("CheckBox" & "_" & sender.tag), CheckBox).Checked = Cheat_Enabled 
    End Sub 

End Class 

希望如果我可以像CType一樣控制名稱來捕獲變量名稱並使用它,例如像這樣:

Dim Cheat_Enabled As Boolean 

Private Sub CheckBox_Cheat_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox_Cheat.CheckedChanged 

    ' Sender.name is : "CheckBox_Cheat" 
    ' Sender.tag is : "Cheat" 
    ' Variable name is: "Cheat_Enabled" 

    If sender.checked Then 
     CType(Variable(sender.tag & "_Enabled"), Boolean) = True 
    Else 
     CType(Variable(sender.tag & "_Enabled"), Boolean) = False 
    End If 

End Sub 
+0

你能解釋一下爲什麼你需要做到這一點?正如Alex指出的那樣,這是可能的,但這很可能是不必要的。在你的情況下,很有可能有更好的方法來做到這一點。只有在沒有更好的方法可用時才應使用反射。例如,在任何需要知道當前是否啓用的情況下,爲什麼不檢查複選框的值而不是該變量?或者,如果你需要變量,爲什麼不在'CheckedChanged'事件中設置'Cheat_Enabled = CheckBox_Cheat.Checked'? –

+0

因爲我有很多控件,有很多標籤和很多布爾變量,這就是我尋找一種動態的方式來修改checkedchanged事件中的變量而不是像你所做的那樣做的原因說過。感謝評論! – ElektroStudios

回答

2

MSDN你可以找到一個VB.Net例如如何枚舉一個給定類的所有成員:

Imports System 
Imports System.Reflection 
Imports Microsoft.VisualBasic 

Class MyFindMembersClass 

    Public Shared Sub Main() 
     Dim objTest As New Object() 
     Dim objType As Type = objTest.GetType() 
     Dim arrayMemberInfo() As MemberInfo 
     Try 
      'Find all static or public methods in the Object 
      'class that match the specified name. 
      arrayMemberInfo = objType.FindMembers(MemberTypes.Method, _ 
           BindingFlags.Public Or BindingFlags.Static _ 
           Or BindingFlags.Instance, _ 
           New MemberFilter(AddressOf DelegateToSearchCriteria), _ 
           "ReferenceEquals") 

      Dim index As Integer 
      For index = 0 To arrayMemberInfo.Length - 1 
       Console.WriteLine("Result of FindMembers -" + ControlChars.Tab + _ 
           arrayMemberInfo(index).ToString() + ControlChars.Cr) 
      Next index 
     Catch e As Exception 
      Console.WriteLine("Exception : " + e.ToString()) 
     End Try 
    End Sub 'Main 

    Public Shared Function DelegateToSearchCriteria _ 
          (ByVal objMemberInfo As MemberInfo, _ 
          ByVal objSearch As Object) As Boolean 
     ' Compare the name of the member function with the filter criteria. 
     If objMemberInfo.Name.ToString() = objSearch.ToString() Then 
      Return True 
     Else 
      Return False 
     End If 
    End Function 'DelegateToSearchCriteria 
End Class 'MyFindMembersClass 

另一種方法是把你所有的布爾變量爲一個Dictionary對象。這將允許您在不使用Reflection的情況下「按名稱」訪問布爾值。

實例來加以說明:

Imports System.Collections.Generic 

Module vbModule 

Class Example 

    Private _dictionary 

    Public Sub New() 
     ' Allocate and populate the field Dictionary. 
     Me._dictionary = New Dictionary(Of String, Boolean) 
     Me._dictionary.Add("v1", False) 
     Me._dictionary.Add("v2", True) 
    End Sub 

    Public Function GetValue(name as String) As Boolean 
     ' Return value from private Dictionary. 
     Return Me._dictionary.Item(name) 
    End Function 

    Public Sub SetValue(name as String, val as Boolean) 
     Me._dictionary.Item(name) = val 
    End Sub 

End Class 

Sub Main() 
    ' Allocate an instance of the class. 
    Dim example As New Example 

    ' Write a value from the class. 
    Console.WriteLine(example.GetValue("v1")) 
    Console.WriteLine(example.GetValue("v2")) 
    example.SetValue("v1", true) 
    Console.WriteLine(example.GetValue("v1")) 
End Sub 
End Module 
+0

謝謝這麼多,我不是一個專家,我不明白如何使用MSDN示例爲我的目的,你能給我一個MSDN的例子或其他信息(字典)的信息?也許我會以這種方式獲得更多的運氣,或者如果你能延伸反射的例子。 – ElektroStudios

+0

再次感謝,字典救了我 – ElektroStudios

+0

比hastable更好地使用字典嗎?或者不管? – ElektroStudios