比较VB.NET中的对象

时间:2008-11-21 14:56:22

标签: vb.net

我想编写一个接受两个对象作为参数的函数,并仅比较对象中包含的字段。我不知道对象在设计时会是什么类型,但传递的对象将是我们应用程序中使用的类。

是否可以在不知道运行时类型的情况下比较对象的字段?

5 个答案:

答案 0 :(得分:7)

是的,可以在运行时找到对象的字段,属性和方法。您将需要使用System.Reflection并找到匹配的字段,确保数据类型兼容,然后比较值。

答案 1 :(得分:2)

为此,我们将所有数据访问类覆盖GetHashCode:例如。

Public Overrides Function GetHashCode() As Integer
    Dim sb As New System.Text.StringBuilder

    sb.Append(_dateOfBirth)
    sb.Append(_notes)
    sb.Append(Name.LastName)
    sb.Append(Name.Preferred)
    sb.Append(Name.Title)
    sb.Append(Name.Forenames)

    Return sb.ToString.GetHashCode()

End Function

然后比较两个对象,你可以说

Public Shared Function Compare(ByVal p1 As Person, ByVal p2 As Person) As Boolean

    Return p1.GetHashCode = p2.GetHashCode

End Function

或者更一般地说:

object1.GetHashCode = object2.GetHashCode

答案 2 :(得分:1)

如果您不想编写反射代码,这里有一个包含对象比较函数的库:

AdapdevNet

另外,我写的一篇文章 Using Reflection to test for Equality ,其代码在C#中。你可以很容易地把它转换成VB.NET。

答案 3 :(得分:0)

此函数将比较两个简单对象(_Objeto1和_Objeto2)。首先,他们一定不能玩。其次,它们必须是相同的类型(_AnyObject.GetType.ToString)。第三,我们必须遍历每个属性并比较它们的值。如果至少有一个属性具有不同的值,则函数返回FALSE。否则,它返回TRUE。

此函数不考虑复杂对象(其中一个属性是另一个对象)。简单对象是字符串,整数,布尔值等。

进口系统 导入Microsoft.VisualBasic Imports System.Reflection

Public Function CompararObjetos(ByVal _Objeto1 As Object,ByVal _Objeto2 As Object)As Boolean

    Dim _TipoObjeto1 As String = ""
    Dim _TipoObjeto2 As String = ""

    If Not _Objeto1 Is Nothing Then
        _TipoObjeto1 = _Objeto1.GetType.ToString
    End If

    If Not _Objeto2 Is Nothing Then
        _TipoObjeto2 = _Objeto2.GetType.ToString
    End If

    Dim _Resultado As Boolean = True

    If _TipoObjeto1 = _TipoObjeto2 Then
        Dim Propiedades() As PropertyInfo = _Objeto1.GetType.GetProperties
        Dim Propiedad As PropertyInfo
        Dim _Valor1 As Object
        Dim _Valor2 As Object
        For Each Propiedad In Propiedades
            _Valor1 = Propiedad.GetValue(_Objeto1, Nothing)
            _Valor2 = Propiedad.GetValue(_Objeto2, Nothing)
            If _Valor1 <> _Valor2 Then
                _Resultado = False
                Exit For
            End If
        Next
    Else
        _Resultado = False
    End If

    Return _Resultado

End Function

答案 4 :(得分:0)

我建议使用这个NuGet包来比较对象: https://www.nuget.org/packages/CompareNETObjects/

这是它的源代码: https://github.com/GregFinzer/Compare-Net-Objects

P.S。我并不隶属于它,但在几个项目中使用过。