2016-06-14 5 views
2

VB.Netの使用。私は同じクラスの2つのオブジェクトからプロパティ値を取得し、それらを比較しようとしています。値が異なる場合は、値の内容と変更内容を示す文字列に値を追加します。 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. 

EDIT: 私はこの方法を試してみましたが、まだ(以下のコードを)と同じエラーを得ました。また、 '='を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 

説明:

myFieldがタイプBefore.Singleのために作成されていますが、ではありませんBeforeでそれを使用していますBefore.Singleと同じタイプです。

+0

ほぼ完璧に機能しました!今すぐ私の終わりにいくつかのものを変更する必要があります、助けてくれてありがとう! – MattCucco

関連する問題