我想测试2个对象值是否可以比较。比较2个对象以查看它们是否在VB.NET中兼容
例如,如果我有一个变量定义为包含“A”和定义为具有0的值的对象另一个变量的值的对象(这些必须被定义为类型对象。)
当我做一个简单的比较If Object1 <> Object2 Then
等我得到一个错误。 那么如何测试以查看对象是否具有可比性?我看了TryCast,DirectCast,Ctype等,但看不到这些可以帮助。
有任何建议。
我想测试2个对象值是否可以比较。比较2个对象以查看它们是否在VB.NET中兼容
例如,如果我有一个变量定义为包含“A”和定义为具有0的值的对象另一个变量的值的对象(这些必须被定义为类型对象。)
当我做一个简单的比较If Object1 <> Object2 Then
等我得到一个错误。 那么如何测试以查看对象是否具有可比性?我看了TryCast,DirectCast,Ctype等,但看不到这些可以帮助。
有任何建议。
定义你的类时,应使用ICompare和IComparable的接口。 How to use ICompare and IComparable (MSDN)
您想要在班级中实施IComparer interface。
Compare方法就是魔法发生的地方。
如果你只是想检查,看看它们是相同的类型,那么我认为你可以这样做:
If Object1.GetType is Object2.GetTypeThen
...
End If
感谢您的回复。这比较了两种类型,但并不告诉我是否可以比较不同的类型。例如int16和int64是不同的类型,但具有可比性。 – Tim
另一种方式做,这将是超载的GetHashCode方法,来回报你的对象组合键,然后比较Object1.GetHashcode与Object2.GetHashCode。 但实际上我会(如其他答案中所述)实现IComparable(Of T)。
编辑 - 添加了示例代码
Public Class MyClassA
Private _myVariable As String = String.Empty
Public Property MyProperty() As String
Get
Return "Fooey"
End Get
Set(ByVal value As String)
_myVariable = value
End Set
End Property
Public Overloads Overrides Function GetHashCode() As Integer
Return MyProperty.GetHashCode
End Function
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Return (Me.GetHashCode = obj.GetHashCode)
End Function
End Class
Public Class MyClassB
Private _myVariable As String = String.Empty
Public Property MyProperty() As String
Get
Return "Fooey"
End Get
Set(ByVal value As String)
_myVariable = value
End Set
End Property
Public Overloads Overrides Function GetHashCode() As Integer
Return MyProperty.GetHashCode
End Function
Public Overrides Function Equals(ByVal obj As Object) As Boolean
Return (Me.GetHashCode = obj.GetHashCode)
End Function
End Class
因为你已覆盖(和重载回到你想要的类型)等于运算,并在其使用的overidden GetHashCode的方法,你可以,你可以做
If MyClassA.Equals(MyClassB) ......
所有,那么你所要做的就是决定你放什么的GetHashCode方法,将允许您比较一个对象到另一个(组合键)。
希望这会有所帮助。
您可能能够使用Type.IsAssignableFrom
方法来测试类型兼容性。当然,这是关于可分配性而不是可比性的,但我想这是最接近你会得到的。
FWIW,我宁愿尝试解决您的要求,这两种类型都是Object
。难道你不能用一些其他的通用基础类型来提供可比性的机制吗?在这个问题上抛出简单的Object
听起来像是一个设计问题,并且具有独特的代码味道。
是,gethashcode,等于仅比较参考值,但比较值。尝试IEqualityComparer。 希望这个帮助
感谢您的回复。我试过这个,如果这两个对象是不同的类型,会得到一个错误。 – Tim