首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GetValue和System.Reflection

使用GetValue和System.Reflection
EN

Stack Overflow用户
提问于 2016-06-14 13:06:11
回答 1查看 765关注 0票数 2

使用VB.Net。我试图从同一个类的两个对象获取属性值,并对它们进行比较。如果值是不同的,那么我想将它们添加到一个字符串中,显示值是什么以及它们更改了什么。我对GetValue有问题。下面是这个函数的代码:

代码语言:javascript
复制
  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

如果有任何变化的话,应该只有一件事情发生改变。这就是为什么它只返回第一个元素。当我调试时,它每次都会捕获一个异常。它给我带来的错误如下:

代码语言:javascript
复制
        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 (没有改变任何东西),我也尝试在每个值周围添加parens,这也没有改变任何东西。

代码语言:javascript
复制
If myField(index).GetValue(myField(index).Name) = myField2(index).GetValue(myField(index).Name)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-14 13:48:28

更改:

代码语言:javascript
复制
If Not myField(index).GetValue(Before) = myField2(index).GetValue(After) Then

至:

代码语言:javascript
复制
If Not myField(index).GetValue(Before.Single) = myField2(index).GetValue(After.Single) Then

解释:

myField是为Before.Single类型创建的,但是您将它与与Before.Single不同的Before一起使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37812948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档