2010-02-10 29 views
0

我想测试2个对象值是否可以比较。比较2个对象以查看它们是否在VB.NET中兼容

例如,如果我有一个变量定义为包含“A”和定义为具有0的值的对象另一个变量的值的对象(这些必须被定义为类型对象。)

当我做一个简单的比较If Object1 <> Object2 Then等我得到一个错误。 那么如何测试以查看对象是否具有可比性?我看了TryCast,DirectCast,Ctype等,但看不到这些可以帮助。

有任何建议。

回答

1

您想要在班级中实施IComparer interface

Compare方法就是魔法发生的地方。

+0

感谢您的回复。我试过这个,如果这两个对象是不同的类型,会得到一个错误。 – Tim

1

如果你只是想检查,看看它们是相同的类型,那么我认为你可以这样做:

If Object1.GetType is Object2.GetTypeThen 
    ... 
End If 
+0

感谢您的回复。这比较了两种类型,但并不告诉我是否可以比较不同的类型。例如int16和int64是不同的类型,但具有可比性。 – Tim

0

另一种方式做,这将是超载的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方法,将允许您比较一个对象到另一个(组合键)。

希望这会有所帮助。

+0

谢谢,任何机会的一些示例代码。我正在为此而苦苦挣扎。 Regards – Tim

+0

GetHashCode如何帮助? - 除了你的代码没有编译的事实('GetHashCode'返回一个'Integer',而不是'String',并且你的'Equals'方法被破坏了)。 –

+0

我已经改变了代码,它在我的编译,因为我没有选择严格(但可以承认,我没有尝试它)。这将允许他比较他的两个物体。 – Ben

0

您可能能够使用Type.IsAssignableFrom方法来测试类型兼容性。当然,这是关于可分配性而不是可比性的,但我想这是最接近你会得到的。

FWIW,我宁愿尝试解决您的要求,这两种类型都是Object。难道你不能用一些其他的通用基础类型来提供可比性的机制吗?在这个问题上抛出简单的Object听起来像是一个设计问题,并且具有独特的代码味道。

0

是,gethashcode,等于仅比较参考值,但比较值。尝试IEqualityComparer。 希望这个帮助

相关问题