Объект PropertyInfo.GetValue() не соответствует целевому типу.

Я впервые копаюсь в Reflection, и я действительно застрял. Я погуглил все, что мог придумать. Я на 90% там, где хочу быть сейчас.

Я пытаюсь вернуть значение свойства в пользовательском классе через Reflection.

Вот мое объявление класса:

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

Класс, который я написал для просмотра класса через отражение, выглядит следующим образом:

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

Я поставил точку останова на строке property_value = propInfo.GetValue(Me, Nothing), чтобы увидеть результат.

Вот как я называю свой код:

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

Через отражение я могу видеть PropertyName и Type, все, что мне нужно, это значение свойства! Теперь, когда я добираюсь до точки останова, я получаю TargetException, и в сообщении об ошибке говорится: «Объект не соответствует целевому типу». Сейчас час ночи, и я разбит, любая помощь прямо сейчас будет оценена по достоинству. Я искал MSDN и Google до смерти, а затем в последний раз для удовольствия;)


person StevenMcD    schedule 21.11.2008    source источник


Ответы (2)


Me относится к объекту ObjectCompare, который отличается от класса, из которого были получены объекты PropertyInfo (Class2). Вам также необходимо передать объект того типа, из которого вы получили 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)
person tvanfosson    schedule 22.11.2008
comment
Я только что проснулся и попробовал, и это работает как шарм! Я думал, что первый параметр метода GetValue относится к объекту PropertyInfo, из которого вы хотите получить значение. Спасибо еще раз! - person StevenMcD; 22.11.2008
comment
+1 это сработало и для меня. Мой случай был другим; Я использовал propInfo.GetValue(It), но информация о свойствах была взята из неправильного класса. Здоровья чувак. - person ashes999; 01.03.2012
comment
+1 У меня были проблемы с использованием метода GetValue. Ваше объяснение того, что GetValue вызывается с объектом, из которого была построена PropertyInfo, было точным! - person Travis J; 05.03.2012

Я не совсем уверен, что знаю, что вы пытаетесь здесь сделать, но я попробую.

Вот код, который я придумал:

Звонок:

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


        Dim go As New ObjectCompare
        go.CompareObjects(test)

Класс:

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

Сравнить:

 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
person Nathan W    schedule 22.11.2008