如何在函数中引用DIM名称(而不是值)?

时间:2017-09-26 16:42:10

标签: vb.net

我在Dim中公开声明了Form,如何在函数中设置/更改此Dim的值,而无需手动调用它:{{1} }?

我需要它是这样的:

Test = "New Val"

2 个答案:

答案 0 :(得分:1)

使用System.Reflection.GetField (String, BindingFlags)按名称访问字段

以下是设置和获取字段值的一些功能:

Public Sub SetValue(name As String, value As Object)
    Dim fi As FieldInfo = Me.GetType().GetField(name, BindingFlags.NonPublic Or BindingFlags.Instance)
    fi.SetValue(Me, value)
End Sub

Public Function GetValue(name As String) As Object
    Dim fi As FieldInfo = Me.GetType().GetField(name, BindingFlags.NonPublic Or BindingFlags.Instance)
    Return fi.GetValue(Me)
End Function

注意:BindingFlags特定于您的应用程序,您已在其中声明了私有字段(Dim Test As ...)。如果您想使用私人字段以外的其他内容,请参阅BindingFlags Enumeration

在您的具体实现中,您可以在按钮单击中为该字段设置一个新字符串,如此

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    SetValue("Test1", "new value")
End Sub

演示其工作原理的最小完整示例可能如下所示

Dim f2 = New Form2()

Console.WriteLine(f2.GetValue("Test1"))
Console.WriteLine(f2.GetValue("Test2"))

f2.SetValue("Test1", "new value")
f2.SetValue("Test2", 1)

Console.WriteLine(f2.GetValue("Test1"))
Console.WriteLine(f2.GetValue("Test2"))

表格

Public Class Form2

    Dim Test1 As String = "initial value"
    Dim Test2 As Integer = 0

    Public Sub SetValue(name As String, value As Object)
        Dim fi As FieldInfo = Me.GetType().GetField(name, BindingFlags.NonPublic Or BindingFlags.Instance)
        fi.SetValue(Me, value)
    End Sub

    Public Function GetValue(name As String) As Object
        Dim fi As FieldInfo = Me.GetType().GetField(name, BindingFlags.NonPublic Or BindingFlags.Instance)
        Return fi.GetValue(Me)
    End Function

End Class

输出:

  

初始值   
0   新的价值   
1

另一个注意事项:设置字段时,您无法确定该类型。尝试f2.SetValue("Test2", "new value")会编译,但在尝试将字符串转换为整数时会在运行时失败。如果您知道所有字段都是字符串,那么最好使用适当的强制转换来声明Public Sub SetValue(name As String, value As String)Public Function GetValue(name As String) As String

答案 1 :(得分:0)

如果您只想更改变量的值,请将您的功能更改为此。

Private Sub PassingDimName(ByRef DimName As String)
    'Having it like this gives the following error:
    '"Keyword does not name a type"
    DimName = "Dims new value"
End Sub