簡體   English   中英

如何檢查變量的最終類型?

[英]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

編輯:似乎原來的問題是我身邊的錯。 我正在檢查錯誤的類型(那些愚蠢的第三部分庫...)但是,我仍然試圖在上面的代碼中找到錯誤。

編輯:再次,我的錯。 我正在檢查BaseUnrelated類型。

您的代碼似乎幾乎完全正確。

我做到了這一點,工作正常:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM