2016-06-14 3 views
2

VB.Net 사용. 동일한 클래스의 두 객체에서 속성 값을 가져 와서 비교하려고합니다. 값이 다른 경우 값이 무엇이고 변경된 내용을 나타내는 문자열에 값을 추가하려고합니다. GetValue에 문제가 있습니다.GetValue 및 System.Reflection 사용

Public Function GetRowChangesList(ByVal Before As IEnumerable(Of Object), ByVal After As IEnumerable(Of Object), ByRef isNew As Boolean) As String 

    Dim TheseChanges As List(Of String) = Nothing 

    'any errors, return "" 
    Try 

     'If Lists are both empty, return 
     If Before Is Nothing And After Is Nothing Then 
      Return "" 
     End If 

     'Figure out the object type and make sure before and after match 
     Dim DataTypeBefore As Type 
     Dim DataTypeAfter As Type 

     DataTypeBefore = Before.Single.GetType() 
     DataTypeAfter = After.Single.GetType() 

     'if they don't match function won't work 
     If DataTypeBefore IsNot DataTypeAfter Then 
      Return "" 
     End If 


     Dim myField As PropertyInfo() = Before.Single.GetType().GetProperties() 
     Dim myField2 As PropertyInfo() = After.Single.GetType().GetProperties() 

     'Find the changes 
     Dim index As Integer 

     For index = 0 To myField2.Length - 1 
      If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then 

       TheseChanges(0) += ("Change happened at: " + myField(index).Name.ToString + " Values changed from: " + 
        myField(index).GetValue(Before).ToString + " To " + myField2(index).GetValue(After).ToString) 

      End If 
     Next 

    Catch ex As Exception 

     'send error 
     SendErrorEmail(ex, "Saving changes for: '" + Before.Single.GetType().ToString) 

    End Try 

    'return 
    Return TheseChanges(0) 

End Function 

만 아무것도 전혀 변경하는 경우 변경 한 가지가 있어야한다 : 다음은이 기능에 대한 코드입니다. 이것이 바로 첫 번째 요소를 반환하는 이유입니다. 디버깅 할 때마다 예외가 발생합니다. 그것은 나를주는 오류는 다음과 같습니다 :

 If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then error BC30199: '(' expected.  
    TheseChanges(0) = ("Change happened at: " + myField(index).Name.ToString + " Values changed from: " + error BC30201: Expression expected. 
    myField(index).GetValue(Before).ToString + " To " + myField2(index).GetValue(After).ToString) error BC37237: ')' is not a valid format specifier 
    End If error BC30201: Expression expected. 
    Next error BC30201: Expression expected. 

편집 : 난 그냥이 방법을 시도하고 여전히 (아래 코드) 같은 오류를 얻었다. 또한 그냥 '='isNot (아무것도 변경하지 않았다) 변경 시도하고 각 값 주위에 괄호 추가 시도하고 또한 아무것도 변경하지 않았다.

If myField(index).GetValue(myField(index).Name) = myField2(index).GetValue(myField(index).Name) 

답변

1

변경 :

If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then 

사람 :

는 설명
If Not myField(index).GetValue(Before.Single) = myField2(index).GetValue(After.Single) Then 

:

myFieldBefore와 유형 Before.Single 생성됩니다,하지만 당신이 그것을 사용하는 것입니다하지 않는 한 Before.Single과 같은 유형입니다.

+0

거의 완벽하게 작동했습니다. 그냥 내 도움에 대한 감사, 내 물건에 일부 물건을 변경해야합니다! – MattCucco