2008-11-21 11 views
7

Ich grabe zum ersten Mal in Reflection und ich bin wirklich fest. Ich habe alles gegooglet, was mir einfällt. Ich bin 90% wo ich jetzt sein möchte.PropertyInfo.GetValue() "Objekt stimmt nicht mit dem Zieltyp überein."

Ich versuche, den Wert einer Eigenschaft in einer benutzerdefinierten Klasse durch Reflektion zurückzugeben.

Hier ist meine Klassendeklaration:

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 

Die Klasse ich geschrieben habe in der Klasse durch Reflexion zu sehen wie folgt aussieht:

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 

ich auf der property_value = PROPINFO einen Haltepunkt setzen. GetValue (Me, Nothing), um zu sehen, was das Ergebnis ist.

Hier ist, wie ich meinen Code nennen:

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() 

Durch Reflexion ich den Propertynamen und Typen sehen kann, alles was ich brauche ist der Wert der Immobilie! Wenn ich jetzt zum Haltepunkt komme, erhalte ich eine TargetException und die Fehlermeldung "Objekt stimmt nicht mit dem Zieltyp überein". Es ist jetzt 1 Uhr morgens und ich bin ruiniert, jede Hilfe würde jetzt geschätzt werden. Ich habe MSDN und Google in den Tod gesucht und dann auf der letzten Zeit für Spaß;)

Antwort

20

Me bezieht sich auf die ObjectCompare Objekt, das als die Klasse unterscheidet, aus dem die PropertyInfo Objekte abgeleitet wurden (Class2). Sie müssen auch ein Objekt des Typs übergeben, von dem Sie die Objekte PropertyInfo abgerufen haben.

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

Ich bin gerade aufgewacht und habe es gegeben und es funktioniert wie ein Zauber! Ich dachte, der erste Parameter der GetValue-Methode bezog sich auf das PropertyInfo-Objekt, von dem Sie einen Wert abrufen wollten. Danke noch einmal! – StevenMcD

+0

+1 das funktionierte auch für mich. Mein Fall war anders; Ich habe propInfo.GetValue (It) verwendet, aber die Eigenschaftsinformationen wurden der falschen Klasse entnommen. Prost, Mann. – ashes999

+0

+1 Ich hatte Probleme mit der GetValue-Methode. Ihre Erklärung, dass GetValue mit dem Objekt aufgerufen wurde, aus dem PropertyInfo erstellt wurde, war genau richtig! –

1

Ich bin mir nicht wirklich sicher, ich weiß, was Sie hier versuchen, aber ich werde einen Stich dabei haben. Hier

ist der Code, den ich gekommen bin, oben:

Aufruf:

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


     Dim go As New ObjectCompare 
     go.CompareObjects(test) 

Klasse:

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 

Vergleichen:

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 
Verwandte Themen