我想写一个接受两个对象作为参数的函数,只比较对象中包含的字段。我不知道在设计时什么类型的对象,但传递的对象将是我们的应用程序中使用的类。在VB.NET中比较对象
是否有可能比较对象的字段而不知道它们的类型在运行时?
我想写一个接受两个对象作为参数的函数,只比较对象中包含的字段。我不知道在设计时什么类型的对象,但传递的对象将是我们的应用程序中使用的类。在VB.NET中比较对象
是否有可能比较对象的字段而不知道它们的类型在运行时?
是的,可以在运行时查找对象的字段,属性和方法。您需要使用System.Reflection并查找匹配的字段,确保数据类型兼容,然后比较这些值。
对于这个工作,我们有我们所有的数据访问类重写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
然后比较两个对象,你可以说
或者更一般地:
object1.GetHashCode = object2.GetHashCode
好方法。你可以使用反射,但这很简单,干净。我想补充的一件事就是在你的类上实现IComparable。 – codeConcussion 2008-11-21 16:25:25
感谢您的想法,但我需要能够比较特定的领域,但这将在我们的应用程序的其他地方有用。再次感谢! – StevenMcD 2008-11-21 19:50:24
如果你不想写的反射代码,这里是一个库,包括对象比较功能:
另外,我写的一篇文章,Using Reflection to test for Equality,在C#中有代码。你可以很容易地将它转换成VB.NET。
该函数将比较两个简单对象(_Objeto1和_Objeto2)。首先,他们一定不是什么。其次,它们必须是相同的类型(_AnyObject.GetType.ToString)。第三,我们必须遍历每个属性并比较它们的值。如果至少有一个属性具有不同的值,则函数返回FALSE。否则,它返回TRUE。
该函数不考虑复杂对象(它们的一个属性是另一个对象)。简单对象是字符串,整数,布尔等
进口系统 进口Microsoft.VisualBasic程序 进口的System.Reflection
公共功能CompararObjetos(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
我建议使用这个NuGet包来比较对象: https://www.nuget.org/packages/CompareNETObjects/
这里是它的酸味ce代码: https://github.com/GregFinzer/Compare-Net-Objects
p.s.我不隶属于它,但在一些项目中使用。
System.Reflection是我以前记不住的命名空间!感谢一百万人! – StevenMcD 2008-11-21 19:51:03