Vb.net 级联可数(Of T)

Vb.net 级联可数(Of T),vb.net,generics,iequatable,Vb.net,Generics,Iequatable,我有几个实体,我需要分别使其具有足够的(可能性) 我希望他们首先检查EntityId之间的相等性,然后如果两者都为零,则应检查其他属性,例如相同的联系人姓名、相同的电话号码等 这是如何做到的?改编自: 公共类实体:实现IEquatable(Of实体) 公共重载函数等于布尔值(其他为实体)_ 实现(实体的)IEquatable。等于 如果Me.Id=other.Id,则 返回Me.ContactName=other.ContactName,并返回Me.PhoneNumber=other.Phone

我有几个实体,我需要分别使其具有足够的(可能性)

我希望他们首先检查EntityId之间的相等性,然后如果两者都为零,则应检查其他属性,例如相同的联系人姓名、相同的电话号码等

这是如何做到的?

改编自:

公共类实体:实现IEquatable(Of实体)
公共重载函数等于布尔值(其他为实体)_
实现(实体的)IEquatable。等于
如果Me.Id=other.Id,则
返回Me.ContactName=other.ContactName,并返回Me.PhoneNumber=other.PhoneNumber
其他的
返回错误
如果结束
端函数
公共重写函数等于布尔值(对象为obj)
如果obj为Nothing,则返回MyBase.Equals(obj)
如果obj的类型为实体
返回等于(DirectCast(对象、实体))
其他的
返回错误
如果结束
端函数
公共重写函数GetHashCode()为整数
返回Me.Id.GetHashCode()Xor Me.ContactName.GetHashCode()Xor Me.PhoneNumber.GetHashCode()
端函数
公共共享运算符=(entity1作为实体,entity2作为实体)作为布尔值
返回entity1.Equals(entity2)
终端操作员
作为布尔值的公共共享运算符(entity1作为实体,entity2作为实体)
返回非entity1.Equals(entity2)
终端操作员
末级
注意:


GetHashCode
的实现非常简单,如果您需要在生产环境中使用它,请阅读SO问题的答案。

谢谢Oded。如何避免ContactName上出现NullReferenceException?在尝试访问任何内容之前,请先检查
Me
being
Nothing
。Me不可能什么都不是,我不必检查它,问题是如果Id字段等于Nothing,我应该如何获取它的hashcode?
Public Class Entity : Implements IEquatable(Of Entity)

    Public Overloads Function Equals(other As Entity) As Boolean _
                    Implements IEquatable(Of Entity).Equals
       If Me.Id = other.Id Then
           Return Me.ContactName = other.ContactName AndAlso Me.PhoneNumber = other.PhoneNumber
       Else
          Return False
       End If
    End Function

    Public Overrides Function Equals(obj As Object) As Boolean
       If obj Is Nothing Then Return MyBase.Equals(obj)

       If TypeOf obj Is Entity
          Return Equals(DirectCast(obj, Entity)) 
       Else
          Return False  
       End If
    End Function   

    Public Overrides Function GetHashCode() As Integer
       Return Me.Id.GetHashCode() Xor Me.ContactName.GetHashCode() Xor Me.PhoneNumber.GetHashCode()
    End Function

    Public Shared Operator = (entity1 As Entity, entity2 As Entity) As Boolean
       Return entity1.Equals(entity2)
    End Operator

   Public Shared Operator <> (entity1 As Entity, entity2 As Entity) As Boolean
      Return Not entity1.Equals(entity2)
   End Operator


End Class