如何检查变量的最终类型?

时间:2010-09-06 09:32:08

标签: vb.net .net-2.0 types

我有来自第三方库的BaseClass,DerivedClass1和DerivedClass2。 DerivedClass1和DerivedClass2都继承自BaseClass。

有一个来自同一个库的ContainerClass,其成员变量ActiveItem可以是DerivedClass1或DerivedClass2,因此它被声明为BaseClass。

我想知道ActiveItem是否属于DerivedClass1,因为它可以在运行时更改,恕不另行通知。

如果我这样做

 Dim isDerivedClass1 as boolean = TypeOf(oject.ActiveItem) Is DerivedClass1 

然后我得到一个编译时错误,告诉我ActiveItem永远不能是DerivedClass1类型。

我尝试了几种GetType和TypeOf的组合,但似乎无法检查这一点。我还试图声明一个辅助DerivedClass1变量并比较它们的类型,但也没有运气。

有没有解决方法? 我想我可以用反射来做,但看起来真的有点过分了。

修改 以下代码无法在vs2005 SP1中编译。

Public Class Base
    Public x As Integer
End Class
Public Class Derived1
Inherits Base
    Public y As Integer
End Class
Public Class Derived2
Inherits Base
    Public z As Integer
End Class
Public Class Unrelated
    Public var As Base
End Class


Public Class Form1
    Public Sub Test(ByVal obj As Unrelated)
        Dim tst As Boolean
        tst = TypeOf obj Is Derived1
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim obj As New Unrelated
        obj.var = New Derived1
        Test(obj)
    End Sub
End Class

修改 似乎原来的问题是我身边的错。我正在检查错误的类型(那些愚蠢的第三部分库......) 但是,我仍然试图在上面的代码中找到错误。

修改 再次,我的错。我正在针对基地检查无关类型。

3 个答案:

答案 0 :(得分:5)

您的代码似乎几乎完全正确。

我做到了这一点,效果很好:

Dim isDerivedClass1 As Boolean = TypeOf oject.ActiveItem Is DerivedClass1
Dim isDerivedClass2 As Boolean = TypeOf oject.ActiveItem Is DerivedClass2

我错过了什么吗?

编辑:我认为你错过了编辑过的代码中的var属性。

Public Sub Test(ByVal obj As Unrelated)
    Dim tst As Boolean
    tst = TypeOf obj.var Is Derived1
End Sub

答案 1 :(得分:2)

你必须信任编译器,确信DerivedClass1 继承BaseClass。它没有错。这是因为它没有在DerivedClass1声明中看到 Inherits 子句,或者是因为它从另一个程序集中选择了一个BaseClass定义。

要修复前一个问题,您别无选择,只能将ActiveItem声明为Object或查找这些类共有的另一种类型。使用对象浏览器。要解决后一个问题,您必须更改Imports指令或拼出BaseClass类型的全名(包括命名空间)。

答案 2 :(得分:1)

一种简单的可能性是使用TryCast

Dim isDerivedClass1 As Boolean = TryCast(object.ActiveItem, DerivedClass1) IsNot Nothing