我有来自第三方库的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
修改 似乎原来的问题是我身边的错。我正在检查错误的类型(那些愚蠢的第三部分库......) 但是,我仍然试图在上面的代码中找到错误。
修改 再次,我的错。我正在针对基地检查无关类型。
答案 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