0

「 Cheat_Enabled」と呼ばれる変数があります。

 Dim Cheat_Enabled As Boolean

そして、「CheckBox_Cheat」というタグが付いた「Cheat」という名前のチェックボックス

ここで、コントロールの名前を分割 (または何か) して var の値を変更する動的メソッドを実行したいと考えています。

たとえば、次のようなものです (コードは明らかに機能しません)。

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"

これは 1 つの CType または DirectCast または GetObject で実行できると思いますが、正確な方法はわかりません。

アップデート:

これは同様の簡単なコードですが、ControlName を VariableName に変換する代わりに、コントロール タグを Checkbox の 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

たとえば、次のように、変数名をキャッチして使用するためにコントロール名を 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
4

1 に答える 1

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

もう 1 つの方法は、すべてのブール変数を 1 つの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
于 2013-04-12T10:24:46.927 に答える