我想编写一个接受两个对象作为参数的函数,并仅比较对象中包含的字段。我不知道对象在设计时会是什么类型,但传递的对象将是我们应用程序中使用的类。
是否可以在不知道运行时类型的情况下比较对象的字段?
答案 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)
如果您不想编写反射代码,这里有一个包含对象比较函数的库:
另外,我写的一篇文章 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。我并不隶属于它,但在几个项目中使用过。