2013-03-06 1 views
0

이 질문은 VB ReDim of member field programmatically의 후속 작업입니다. 배열의 크기가 적절하게 조정 된 후 요소의 값을 설정하려고 시도하지만 첫 번째 값 (MySB.AssignValues ​​(0, "B", 0, 7.6))을 할당하려고 시도 할 때 런타임에 예외가 발생합니다VB 프로그래밍 방식으로 멤버 필드 할당

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 

미리 감사드립니다.

+1

AssignValues의 어느 라인이 오류가 발생합니다? – Melanie

+0

"f.SetValue (TheValue, TheIndex)" – scriptOmate

답변

0

문제는 GetMember 메서드가 클래스의 double 배열이 아닌 MemberInfo 형식의 배열을 반환한다는 것입니다. GetField를 대신 사용하면 더 쉬울 것입니다. SetValue를 사용하여 값을 설정하려면 GetValue를 호출하고 그 결과를 배열에 캐스트해야합니다. 당신이 배열은 항상 두의 배열이 될 것이라는 점을 알고있는 경우

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 

또는 해당에 직접 전송할 수 있습니다 :

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 
+0

훌륭한 작품입니다. 고맙습니다! 클래스 필드의 인스턴스를 가져온 다음 배열의 요소를 설정하는 방법을 알 수 없습니다. – scriptOmate

관련 문제