代码之家  ›  专栏  ›  技术社区  ›  raven

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

  •  4
  • raven  · 技术社区  · 16 年前

    我有一个基类,一个DerivedClass1和一个来自第三方库的DerivedClass2。DerivedClass1和DerivedClass2都继承自基类。

    同一个库中有一个ContainerClass,它的成员变量ActiveItem可以是DerivedClass1或DerivedClass2,因此它被声明为基类。

    我想知道ActiveItem是否是DerivedClass1,因为它可以在运行时更改而不需要通知。

    如果我这样做了

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

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

    我想我可以用反思来做,但似乎真的太过分了。

    以下代码不在vs2005sp1中编译。

    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 回复  |  直到 16 年前
        1
  •  5
  •   Enigmativity    16 年前

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

    我做过这个,效果很好:

    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
    
        2
  •  2
  •   Hans Passant    16 年前

    在这一点上,您必须信任编译器,因为它确信DerivedClass1是这样做的 不 继承 另一个 装配。

        3
  •  1
  •   Bobby    16 年前

    一个简单的可能性就是 TryCast

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