繁体   English   中英

VB以编程方式分配成员字段

[英]VB Assignment of member field programmatically

这个问题是对VB ReDim编程领域的后续。 在对数组进行适当的尺寸调整之后,我尝试设置元素的值,但是当我尝试分配第一个值时,在运行时出现异常(MySB.AssignValues(0,“ B”,0,7.6))

System.InvalidCastException was unhandled
HResult=-2147467262
Message=Object cannot be stored in an array of this type.
Source=mscorlib

Module TestSetArray

    Public Class BS
        Public A As String
        Public B() As Double
        Public C() As Double

    End Class

    Public Class SB

        Public MyBS() As BS

        'ReadFieldString is a function that returns a string of the field name of Class BS,
        'i.e., A, B or C.  For test purpose, retun a constant
        Public Function ReadFieldString() As String
            Return "B"
        End Function

        'GetArrayDim is a function that returns an integer, which is the size of the array
        'of that field name. For test purpose, retun a constant
        Public Function GetArrayDim() As Integer
            Return 2
        End Function

        Public Sub DimArrays()
            ReDim MyBS(3)
            Dim i As Integer
            For i = 0 To MyBS.Length - 1
                MyBS(i) = New BS()
                Dim f = GetType(BS).GetField(ReadFieldString())
                f.SetValue(MyBS(i), Array.CreateInstance(f.FieldType.GetElementType(), GetArrayDim()))
            Next
        End Sub

        Public Sub AssignValues(MainIndex As Integer, TheName As String, TheIndex As Integer, TheValue As Double)
            Dim f = MyBS(MainIndex).GetType.GetMember(TheName)
            f.SetValue(TheValue, TheIndex)
        End Sub

    End Class

    Sub Main()
        Dim MySB As SB = New SB
        MySB.DimArrays()
        MySB.AssignValues(0, "B", 0, 7.6)
        MySB.AssignValues(0, "B", 1, 8.2)
    End Sub

End Module

提前致谢。

问题在于GetMember方法返回的是MemberInfo类型的数组,而不是类的double数组。 如果您改用GetField,则可能会更轻松。 您必须调用GetValue并将其结果转换为Array才能使用SetValue设置值。

Public Sub AssignValues(MainIndex As Integer, TheName As String, TheIndex As Integer, TheValue As Double)
    Dim f = MyBS(MainIndex).GetType().GetField(TheName)
    Dim doubleArray = DirectCast(f.GetValue(MyBS(MainIndex)), Array)
    doubleArray.SetValue(TheValue, TheIndex)
End Sub

或者,如果您知道该数组将始终是Double的数组,则可以将其直接转换为:

Public Sub AssignValues(MainIndex As Integer, TheName As String, TheIndex As Integer, TheValue As Double)
    Dim f = MyBS(MainIndex).GetType().GetField(TheName)
    Dim doubleArray = DirectCast(f.GetValue(MyBS(MainIndex)), Double())
    doubleArray(TheIndex) = TheValue
End Sub

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM