2008-11-21 26 views
7

Tôi đang đào sâu vào Reflection lần đầu tiên và tôi thực sự bị mắc kẹt. Tôi đã googled tất cả mọi thứ tôi có thể nghĩ đến. Tôi là 90% nơi tôi muốn bây giờ.PropertyInfo.GetValue() "Đối tượng không khớp với loại mục tiêu."

Tôi đang cố trả về giá trị của Thuộc tính trong lớp tùy chỉnh thông qua Phản ánh.

Dưới đây là lời tuyên bố lớp học của tôi:

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 

Lớp tôi đã viết để xem xét các lớp thông qua phản ánh trông như thế này:

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 

tôi đặt một breakpoint trên property_value = propInfo. GetValue (Tôi, Không có gì) để xem kết quả là gì.

Đây là cách tôi gọi mã của tôi:

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

Qua phản ánh tôi có thể thấy PropertyName và Type, tất cả tôi cần là giá trị của tài sản! Bây giờ khi tôi nhận được đến điểm ngắt, tôi nhận được một TargetException và thông báo lỗi nói "Đối tượng không phù hợp với loại mục tiêu." Bây giờ 1 giờ sáng của nó và tôi bị đắm, bất kỳ sự giúp đỡ nào ngay bây giờ sẽ được đánh giá cao. Tôi đã tìm kiếm MSDN và Google đến chết và sau đó đúng thời hạn cuối cùng cho vui;)

Trả lời

20

Me đề cập đến đối tượng ObjectCompare, đó là khác biệt so với các lớp mà từ đó các đối tượng được lấy PropertyInfo (Class2). Bạn cũng cần truyền vào đối tượng thuộc loại mà bạn đã truy xuất các đối tượng 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

Tôi vừa mới thức dậy và cho này một đi và nó hoạt động như một say mê! Tôi nghĩ tham số đầu tiên của phương thức GetValue được gọi là đối tượng PropertyInfo mà bạn muốn lấy một giá trị từ đó. Cảm ơn một lần nữa! – StevenMcD

+0

+1 điều này cũng làm việc cho tôi. Trường hợp của tôi khác; Tôi đã sử dụng propInfo.GetValue (It), nhưng infos thuộc tính được lấy từ lớp sai. Ăn mừng nào. – ashes999

+0

+1 Tôi gặp khó khăn khi sử dụng phương thức GetValue. Lời giải thích của bạn về việc đảm bảo rằng GetValue được gọi với đối tượng mà PropertyInfo đã được tạo từ vị trí trên! –

1

Tôi không thực sự chắc chắn tôi biết những gì bạn đang cố gắng làm ở đây nhưng tôi sẽ có một đâm vào nó.

Dưới đây là đoạn code mà tôi đã đưa ra:

Calling:

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


     Dim go As New ObjectCompare 
     go.CompareObjects(test) 

Lớp:

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 

Hãy so sánh:

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 
Các vấn đề liên quan