2008-11-21 105 views
3

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

是否有可能比较对象的字段而不知道它们的类型在运行时?

回答

7

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

+0

System.Reflection是我以前记不住的命名空间!感谢一百万人! – StevenMcD 2008-11-21 19:51:03

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 

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

​​

或者更一般地:

object1.GetHashCode = object2.GetHashCode 
+0

好方法。你可以使用反射,但这很简单,干净。我想补充的一件事就是在你的类上实现IComparable。 – codeConcussion 2008-11-21 16:25:25

+0

感谢您的想法,但我需要能够比较特定的领域,但这将在我们的应用程序的其他地方有用。再次感谢! – StevenMcD 2008-11-21 19:50:24

0

该函数将比较两个简单对象(_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