Использование GetValue и System.Reflection

Использование VB.Net. Я пытаюсь получить значения свойств из двух объектов одного класса и сравнить их. Если значения разные, я хочу добавить их в строку, показывающую, какими были значения и на что они изменились. У меня проблемы с GetValue. Вот код этой функции:

  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)

person MattCucco    schedule 14.06.2016    source источник


Ответы (1)


Изменять:

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

To:

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

Объяснение:

myField создан для типа Before.Single, но вы используете его с Before, который не совпадает с типом Before.Single.

person dummy    schedule 14.06.2016
comment
работал почти идеально! просто нужно изменить некоторые вещи на моем конце сейчас, спасибо за помощь! - person MattCucco; 14.06.2016