我想寫一個接受兩個對象作爲參數的函數,只比較對象中包含的字段。我不知道在設計時什麼類型的對象,但傳遞的對象將是我們的應用程序中使用的類。在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