2008-11-21 11 views
7

Po raz pierwszy kopie w Reflection i naprawdę utknąłem. Przeszukałem wszystko, co tylko mogę wymyślić. Jestem 90% tam, gdzie chcę teraz być.PropertyInfo.GetValue() "Obiekt nie pasuje do typu celu."

Próbuję zwrócić wartość właściwości w niestandardowej klasie poprzez odbicie.

Oto moja deklaracja klasy:

Public Class Class2 
    Private newPropertyValue2 As String 

    Public Property NewProperty2() As String 
     Get 
      Return newPropertyValue2 
     End Get 
     Set(ByVal value As String) 
      newPropertyValue2 = value 
     End Set 
    End Property 
End Class 

Klasa Pisałem patrzeć na klasę poprzez odbicie wygląda następująco:

Public Class ObjectCompare 
    Private _OriginalObject As PropertyInfo() 

    Public Property OriginalObject() As PropertyInfo() 
     Get 
      Return _OriginalObject 
     End Get 
     Set(ByVal value As PropertyInfo()) 
      _OriginalObject = value 
     End Set 
    End Property 

    Public Sub CompareObjects() 
     Dim property_value As Object 

     For i As Integer = 0 To OriginalObject.Length - 1 
      If OriginalObject(i).GetIndexParameters().Length = 0 Then 
       Dim propInfo As PropertyInfo = OriginalObject(i) 

       Try 
        property_value = propInfo.GetValue(Me, Nothing) 
       Catch ex As TargetException 
       End Try 
      End If 
     Next 
    End Sub 
End Class 

I umieścić punkt przerwania na property_value = propInfo. GetValue (Ja, Nic), aby zobaczyć, jaki jest wynik.

Oto jak ja nazywam mój kod:

Dim test As New Class2 
test.NewProperty2 = "2" 

Dim go As New ObjectCompare 
Dim propInf As PropertyInfo() 
propInf = test.GetType.GetProperties() 

go.OriginalObject = propInf 

go.CompareObjects() 

poprzez odbicie widzę propertyName i rodzaju, wszystko czego potrzebujesz to wartość majątku! Teraz, gdy dojdę do punktu przerwania, otrzymuję TargetException, a komunikat o błędzie mówi "Obiekt nie pasuje do typu celu". Jest teraz o 1 nad ranem i jestem rozbity, jakakolwiek pomoc w tej chwili byłaby doceniona. Rozglądałem MSDN i Google na śmierć, a następnie w ostatniej chwili do zabawy;)

Odpowiedz

20

Me odnosi się do obiektu ObjectCompare, która jest inna niż klasa od których pochodzą PropertyInfo obiekty (Class2). Musisz także przekazać obiekt typu, z którego pobrano obiekty.

Public Sub CompareObjects(ByVal It as Object) 
    Dim property_value As Object 

    For i As Integer = 0 To OriginalObject.Length - 1 
     If OriginalObject(i).GetIndexParameters().Length = 0 Then 
      Dim propInfo As PropertyInfo = OriginalObject(i) 

      Try 
       property_value = propInfo.GetValue(It, Nothing) 
      Catch ex As TargetException 
      End Try 
     End If 
    Next 
End Sub 

go.CompareObjects(test) 
+0

Właśnie się obudziłem i dałem z siebie wszystko, a działa jak urok! Myślałem, że pierwszy parametr metody GetValue odwołuje się do tego obiektu PropertyInfo, z którego chcesz pobrać wartość. Dzięki jeszcze raz! – StevenMcD

+0

+1 to działało również dla mnie. Mój przypadek był inny; Używałem propInfo.GetValue (It), ale informacje o właściwościach zostały pobrane z niewłaściwej klasy. Zdrówko. – ashes999

+0

+1 Miałem problemy z używaniem metody GetValue. Twoje wyjaśnienie, że GetValue zostało wywołane z obiektem, z którego zbudowano PropertyInfo, było na miejscu! –

1

Nie jestem pewien, wiem, co chce zrobić, ale tutaj będę musiał ukłucie na niego.

Oto kod, który mam wymyślić:

Wywołanie:

 Dim test As New Class2 
     test.NewProperty2 = "2" 


     Dim go As New ObjectCompare 
     go.CompareObjects(test) 

Class:

Public Class Class2 
    Private newPropertyValue2 As String 

    Public Property NewProperty2() As String 
     Get 
      Return newPropertyValue2 
     End Get 
     Set(ByVal value As String) 
      newPropertyValue2 = value 
     End Set 
    End Property 
End Class 

Porównaj:

Public Class ObjectCompare 

    Public Sub CompareObjects(ByVal MyType As Object) 

     For Each Prop In MyType.GetType().GetProperties() 
      Dim value = Prop.GetValue(MyType, Nothing) 
      Console.WriteLine(value) 
     Next 
     Console.ReadLine() 
    End Sub 
End Class 
Powiązane problemy