比较VB.NET中的对象

比较VB.NET中的对象,vb.net,Vb.net,我想写一个函数,它接受两个对象作为参数,并且只比较对象中包含的字段。我不知道在设计时对象将是什么类型,但传递的对象将是应用程序中使用的类 是否可以在运行时比较对象的字段而不知道其类型?是的,可以在运行时查找对象的字段、属性和方法。您需要使用System.Reflection并找到匹配字段,确保数据类型兼容,然后比较值。为此,我们让所有数据访问类覆盖GetHashCode:eg Public Overrides Function GetHashCode() As Integer Dim s

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


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

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

为此,我们让所有数据访问类覆盖GetHashCode:eg

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

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


另外,我写的一篇文章中有C#的代码。您可以非常轻松地将其转换为VB.NET。

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

此函数不考虑复杂对象(它们的属性之一是另一个对象)。简单对象是字符串、整数、布尔值等

导入系统 导入Microsoft.VisualBasic 输入系统。反射

作为布尔值的公共函数(ByVal _Objeto1作为对象,ByVal _Objeto2作为对象)

    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
Dim_TipoObjeto1 As String=“”
Dim_TipoObjeto2 As String=“”
如果不是,那么目标1就什么都不是了
_TipoObjeto1=\u Objeto1.GetType.ToString
如果结束
如果不是,那么Objeto2什么都不是
_TipoObjeto2=\u Objeto2.GetType.ToString
如果结束
Dim_Resultado为布尔值=真
如果TipoObjeto1=TipoObjeto2,则
Dim Propiedades()作为PropertyInfo=\u Objeto1.GetType.GetProperties
Dim Propiedad As PropertyInfo属性
Dim_Valor1作为对象
Dim_Valor2作为对象
对于Propiedades中的每个Propiedad
_Valor1=Propiedad.GetValue(_Objeto1,Nothing)
_Valor2=Propiedad.GetValue(_Objeto2,Nothing)
如果_Valor1 _Valor2那么
_Resultado=False
退出
如果结束
下一个
其他的
_Resultado=False
如果结束
返回_Resultado
端函数

我建议使用此NuGet软件包来比较对象:

以下是它的源代码:


p、 我不属于它,但在几个项目中使用过。

很好的方法。您可以使用反射,但这非常简单和干净。我想补充的一件事是在你的类上实现IComparable。谢谢你的想法,但我需要能够比较特定的字段,但这在我们的应用程序的其他地方会很有用。再次感谢!反射是我之前不记得的名称空间!万分感谢!谢谢你的提示,但我不久前就完成了,效果很好。