2008-11-21 9 views
7

Estoy cavando en Reflection por primera vez y estoy realmente atrapado. He buscado en Google todo lo que puedo pensar. Estoy 90% donde quiero estar ahora.PropertyInfo.GetValue() "El objeto no coincide con el tipo de destino".

Estoy tratando de devolver el valor de una propiedad en una clase personalizada a través de Reflection.

aquí está mi declaración de la clase:

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 

La clase que he escrito para mirar la clase a través de la reflexión se ve así:

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 

pongo un punto de interrupción en el valor_propiedad = propInfo. Línea GetValue (Me, Nothing) para ver cuál es el resultado.

Así es como llamo a mi código:

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

través de la reflexión que puedo ver el PropertyName y tipo, todo lo que necesito es el valor de la propiedad! Ahora cuando llego al punto de interrupción, obtengo una TargetException y el mensaje de error dice "El objeto no coincide con el tipo de objetivo". Ahora es la 1 AM de la mañana y estoy destrozado, cualquier ayuda en este momento sería apreciada. He buscado en Google y MSDN a muerte y luego en el último tiempo para la diversión;)

Respuesta

20

Me se refiere al objeto ObjectCompare, que es diferente de la clase de la cual se derivaron los objetos PropertyInfo (Class2). También debe pasar un objeto del tipo del que recuperó los objetos PropertyInfo.

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

¡Acabo de despertar y le he dado una oportunidad y funciona como un encanto! Pensé que el primer parámetro del método GetValue hacía referencia al objeto PropertyInfo del que deseaba recuperar un valor. ¡Gracias de nuevo! – StevenMcD

+0

+1 esto funcionó para mí también. Mi caso fue diferente; Estaba usando propInfo.GetValue (It), pero las informaciones de la propiedad fueron tomadas de la clase incorrecta. Salud, amigo. – ashes999

+0

+1 Estaba teniendo problemas con el uso del método GetValue. Su explicación de asegurarse de que se llamara a GetValue con el objeto desde el que se creó PropertyInfo fue inmediata. –

1

No estoy realmente seguro de lo que estamos tratando de hacer aquí, pero tendrá una puñalada en ella.

Aquí está el código que he llegado:

Calling:

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


     Dim go As New ObjectCompare 
     go.CompareObjects(test) 

Clase:

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 

Compare:

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 
Cuestiones relacionadas