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)
您可以使用反射来设置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)
反射是.NET提供的一种机制,使开发人员能够使他们的程序更加灵活和动态.反射使应用程序可以更加模块化,可扩展和可配置.基于面向对象和.NET类型系统的基础,反射提供了在运行时动态检查,修改甚至创建对象的机制..NET还增加了程序员向其类型添加属性的能力,这些属性提供了有关可在运行时通过反射检查和使用的类型的元数据.
本书探讨了反射可以使用的所有方法,并确定了依赖于反射功能的实际应用和重要的编程技术.它涵盖了反射API,.NET中属性的使用,还介绍了.NET为动态生成代码提供的机制 - 所有这些技术都允许开发人员构建更灵活,动态的应用程序.