[英]How can I check the final type of a variable?
我有一個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
編輯:似乎原來的問題是我身邊的錯。 我正在檢查錯誤的類型(那些愚蠢的第三部分庫...)但是,我仍然試圖在上面的代碼中找到錯誤。
編輯:再次,我的錯。 我正在檢查Base的Unrelated類型。
您的代碼似乎幾乎完全正確。
我做到了這一點,工作正常:
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
你必須相信這個編譯器,它相信DerivedClass1 不繼承BaseClass的。 它沒有錯。 這是因為它沒有在DerivedClass1聲明中看到Inherits子句,或者因為它從另一個程序集中選擇了一個BaseClass定義。
要修復前一個問題,除了將ActiveItem聲明為Object或找到這些類具有的另一種類型之外別無選擇。 使用對象瀏覽器。 要解決后一個問題,您必須更改Imports指令或拼出BaseClass類型的全名(包括命名空間)。
一個簡單的可能性是使用TryCast
:
Dim isDerivedClass1 As Boolean = TryCast(object.ActiveItem, DerivedClass1) IsNot Nothing
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.