Vb.net 将控件名解析为变量名

Vb.net 将控件名解析为变量名,vb.net,visual-studio,variables,dynamic-variables,Vb.net,Visual Studio,Variables,Dynamic Variables,我有一个名为“已启用作弊””的变量: 还有一个名为“Checkbox\u check”的复选框,标签为“check” 现在我想做一个动态方法,通过拆分(或其他)控件的名称来更改var的值 例如,类似这样的内容(代码显然不起作用): 我认为这可以用一个CType、DirectCast或GetObject来完成,但我不知道该怎么做 更新: 这是一个类似的简单代码,但不是将ControlName转换为VariableName,而是将控件标记转换为复选框的ControlName对象: Public Cl

我有一个名为“已启用作弊””的变量:

还有一个名为“Checkbox\u check”的复选框,标签为“check

现在我想做一个动态方法,通过拆分(或其他)控件的名称来更改var的值

例如,类似这样的内容(代码显然不起作用):

我认为这可以用一个CType、DirectCast或GetObject来完成,但我不知道该怎么做

更新:

这是一个类似的简单代码,但不是将ControlName转换为VariableName,而是将控件标记转换为复选框的ControlName对象:

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
我希望,如果我也可以这样做,键入控件名以捕获variablename并使用它,例如:

    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
在中,您可以找到如何枚举给定类的所有成员的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
另一种选择是将所有布尔变量放入一个
字典
对象中。这将允许您“按名称”访问布尔值,而无需使用
反射

举例说明:

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

非常感谢你,我不是专家,我不知道如何使用MSDN示例来实现我的目的。你能给我一个MSDN示例或其他替代方案(字典)的信息吗?也许这样我会更幸运,或者如果你能扩展反射示例的话。使用字典比使用hastable更好吗?还是无关紧要?这里讨论了共同点和不同点:您能解释一下为什么需要这样做吗?正如亚历克斯指出的,这是可能的,但很可能是不必要的。在你的情况下,很可能有更好的方法来解决这个问题。只有在没有更好的方法可用时才应使用反射。例如,在任何需要知道当前是否启用的地方,为什么不选中复选框的值而不是该变量?或者,如果您需要变量,为什么不在
CheckedChanged
事件中设置
Cheat\u Enabled=CheckBox\u Cheat.Checked
?因为我有很多控件,有很多标记和很多布尔变量,这就是为什么我一直在寻找一种动态方法来修改checkedchanged事件中的变量,而不是像您所说的那样。谢谢你的评论!
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
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