动态显示变量内容

问题描述 投票:1回答:1

我想做这个。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim my_variable as String = "hello"

    Dim blabla as string = "my_variable"

    msgbox(blabla) ' I want this to display: "hello"

End Sub

你们能不能用VB.NET帮助我(不要用C#)。

vb.net
1个回答
1
投票

你所想的不能在一个LOCAL变量上实现,比如说 my_variable.

如果该变量是CLASS级别的,那么可以用REFLECTION来完成。

如果这个变量是类级的,并且是公共的,你可以欺骗,使用 CallByName:

Public Class Form1

    Public counter As Integer = 911
    Public my_variable As String = "Hello World!"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim variable As String = TextBox1.Text
        Try
            Dim value As String = CallByName(Me, variable, CallType.Get)
            MessageBox.Show(variable & " = " & value)
        Catch ex As Exception
            MessageBox.Show("Variable not found: " & variable)
        End Try
    End Sub

End Class

在TextBox1中输入变量的名称,它的值就会显示在消息框中......简单易行。

如果你不希望变量是公共的,那么可以通过Reflection来实现,但它看起来没有那么简单和漂亮。 如果你想走这条路,可以去看看。

--- EDIT ---

这是一个可以找到模块公共成员的版本。

enter image description here

代码:

Imports System.Reflection
Public Class Form2

    Public counter As Integer = 911
    Public my_variable As String = "Hello World!"

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        lblResults.Text = ""
        Dim variable As String = TextBox1.Text
        Try
            Dim value As String = CallByName(Me, variable, CallType.Get)
            lblResults.Text = variable & " = " & value
        Catch ex As Exception
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        lblResults.Text = ""
        Dim moduleName As String = txtModule.Text
        Dim moduleField As String = txtModuleMember.Text

        Dim myType As Type = Nothing
        Dim myModule As [Module] = Nothing
        For Each x In Assembly.GetExecutingAssembly().GetModules
            For Each y In x.GetTypes
                If y.Name.ToUpper = moduleName.ToUpper Then
                    myType = y
                    Exit For
                End If
            Next
            If Not IsNothing(myType) Then
                Exit For
            End If
        Next
        If Not IsNothing(myType) Then
            Dim flags As BindingFlags = BindingFlags.IgnoreCase Or BindingFlags.NonPublic Or BindingFlags.Public Or BindingFlags.Static Or BindingFlags.Instance
            Dim fi As FieldInfo = myType.GetField(moduleField, flags)
            If Not IsNothing(fi) Then
                Dim value As String = fi.GetValue(Nothing)
                lblResults.Text = moduleField & " = " & value
            End If
        End If
    End Sub

End Class

Public Module PutThings
    Public SomeValue As String = "...success!..."
End Module

0
投票

我的建议(只是1个想法,大声地想)是为你所有的变量创建一个单独的全局列表,每当你想知道的变量的内容发生变化时,就更新全局列表。

例如:当你准备好不再使用你的变量时,就更新全局列表。

' Global declaration
Dim dictionary As New Dictionary(Of String, String)
Sub Form_Load()

        ' Add keys to all vars you want to lookup later
        With dictionary
          .Add("varCarrot", String.Empty)
          .Add("varPerl", String.Empty)
        End With

End Sub

Sub SomeSub()

    strCarrot = "hello"
    intPerl = 12

    ' Any time the vars change that you want to track, update the respective dictionary key
    dictionary(varCarrot) = strCarrot
    dictionary(varPerl) = intPerl.ToString

    Do Until intPerl = 100

      intPerl += 1
      strCarrot = "hello " & intPerl

      dictionary(varCarrot) = strCarrot
      dictionary(varPerl) = intPerl.ToString

    Loop

End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        dim strLookup as String = text1.text ' the variable you want to lookup entered in the text1 textbox; i.e. "varCarrot"

        ' See if the requested key exists
        If dictionary.ContainsKey(strLookup) Then messagebox.show(dictionary.Item(strLookup))

End Sub

当你准备好不再在你的应用中使用该功能的时候 比如当你完成了所有的调试,并准备最终发布的时候

© www.soinside.com 2019 - 2024. All rights reserved.