PropertyInfo.GetValue() «Объект не соответствует целевому типу».
-
10-07-2019 - |
Вопрос
Я впервые копаюсь в Reflection и действительно застрял.Я погуглил все, что мог придумать.Сейчас я на 90% там, где хочу.
Я пытаюсь вернуть значение свойства в пользовательском классе через отражение.
Вот мое объявление класса:
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, и в сообщении об ошибке говорится: «Объект не соответствует целевому типу». Сейчас 1 часа ночи утра, и я разрушен, любая помощь прямо сейчас будет оценена.Я искал в MSDN и Google до смерти, а в последний раз ради развлечения;)
Решение
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)
Другие советы
Я не совсем уверен, что понимаю, что вы пытаетесь здесь сделать, но я попытаюсь это сделать.
Вот код, который я придумал:
Вызов:
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