如何使用VB.NET为字符串赋值?

Pan*_*zza 9 .net vb.net string variable-assignment

考虑以下代码:

    Dim S1 As String = "a"

    'this is the string in a file
    Dim StringFromFile As String = "S1=hello"

    Dim temp() As String = Split(StringFromFile, "=", -1, CompareMethod.Binary)
    'temp(0) = variable name
    'temp(1) = variable value

    'my question is: how to assign value to S1?
Run Code Online (Sandbox Code Playgroud)

我已经声明了一个名为S1的字符串.现在我想为S1分配新值.新字符串值使用以下格式存储在文件中:[变量名称] [=作为分隔符] [字符串值].在检索存储在文件中的字符串变量名称和值后,如何将值分配给S1?

注意:

temp(0) = "S1"
temp(1) = "hello"
Run Code Online (Sandbox Code Playgroud)

应该注意的是,带有数据的字符串来自一个可能会不时变化的文件!当文件发生变化时,我也希望变量也能改变.

进一步澄清

我需要一段代码,当处理像"S1 = hello"这样的字符串时,代码将首先找到一个声明的变量(即S1),然后为S1变量分配"hello"字符串."="仅作为变量名和变量值的分隔符.

更新:

我尝试使用Mathias Lykkegaard Lorenzen的EDIT 2示例,但在这一行上失败了"NullReferenceException" "Field.SetValue(Me, VariableValue)".请帮我解决问题.以下是基于Mathias Lykkegaard Lorenzen的EDIT 2示例的代码:

Public Sub Ask()
    Try
        Dim S1 As String = "a"

        Dim StringFromFile As String = "S1=hello"

        Dim temp() As String = Split(StringFromFile, "=", -1, CompareMethod.Binary)
        'temp(0) = variable name
        'temp(1) = variable value

        'my question is: how to assign value to S1?
        Dim TypeOfMe As Type = Me.GetType()

        'did this for readability.
        Dim VariableName As String = temp(0)
        Dim VariableValue As String = temp(1)

        'get the field in the class which is private, given the specific name (VariableName).
        Dim Field As FieldInfo = TypeOfMe.GetField(VariableName, BindingFlags.NonPublic Or BindingFlags.Instance)

        'set the value of that field, on the object "Me".
        Field.SetValue(Me, VariableValue) '<-- this line caused NullReferenceException
        MessageBox.Show(S1)
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try

End Sub
Run Code Online (Sandbox Code Playgroud)

Tee*_*een 7

您可以使用反射来设置S1值:

Imports System.Reflection

Public Class Form1
    Public S1 As String = "a"

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim StringFromFile As String = "S1=hello"

        Dim temp() As String = Split(StringFromFile, "=", -1, CompareMethod.Binary)
        'temp(0) = variable name
        'temp(1) = variable value

        SetS1(Me, "S1", temp(1))
        MessageBox.Show(S1)
    End Sub

    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="obj">the class that stores your S1 public field</param>
    ''' <param name="fieldName">that is your S1 field</param>
    ''' <param name="Value">S1 new value, that is hello</param>
    ''' <remarks></remarks>
    Public Sub SetS1(ByVal obj As Object, ByVal fieldName As String, ByVal Value As Object)
        Try
            Dim fi As FieldInfo = obj.GetType().GetField(fieldName, BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.NonPublic)
            If Not fi Is Nothing Then
                fi.SetValue(obj, Value)
            End If

        Catch ex As Exception

        End Try
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

额外资源

有一本关于反思的书非常好,请看一下:

Visual Basic .NET反射手册

反射是.NET提供的一种机制,使开发人员能够使他们的程序更加灵活和动态.反射使应用程序可以更加模块化,可扩展和可配置.基于面向对象和.NET类型系统的基础,反射提供了在运行时动态检查,修改甚至创建对象的机制..NET还增加了程序员向其类型添加属性的能力,这些属性提供了有关可在运行时通过反射检查和使用的类型的元数据.

本书探讨了反射可以使用的所有方法,并确定了依赖于反射功能的实际应用和重要的编程技术.它涵盖了反射API,.NET中属性的使用,还介绍了.NET为动态生成代码提供的机制 - 所有这些技术都允许开发人员构建更灵活,动态的应用程序.