42

我不确定这是否有效的 C#,但希望你明白这一点。:)

switch (msg.GetType()) {
    case ClassA:
        // blah
    case ClassB:
        // blah 2
    case ClassC:
        // blah 3
}

我将如何打开对象的类型但使用 VB.NET 的Select Case

我知道有些人可能会建议使用polymorphism,但我使用的是小消息类的层次结构,所以这在我的情况下真的行不通。

4

5 回答 5

77

使用 VB 2010,对于面向 .NET Framework 4 及更高版本的项目,您现在可以执行以下操作:

Select Case msg.GetType()
    Case GetType(ClassA)
End Select

在早期的 VB 版本中,它不起作用,因为您无法比较两种类型是否相等。您必须使用 Is 关键字检查它们是否指向相同的引用。除非按照 Michael 的建议,使用 Name 或 FullName 等类型的属性进行比较,否则无法在 Select Case 中执行此操作。不过,您可以使用 If 和 ElseIf 的组合:

Dim type = msg.GetType()
If type Is GetType(ClassA)
    ...
ElseIf type Is GetType(ClassB)
    ...
...
End If
于 2009-08-19T18:48:02.477 回答
22

好吧,如果你坚持使用 Select Case,你总是可以选择:

Select Case True
    Case TypeOf msg Is ClassA
        ' do something '
    Case TypeOf msg Is ClassB
        ' do something else '
    Case Else
        ' and so on '
End Select

但我想大多数人都喜欢避免这种事情。If/ElseIf 可能会更清楚。

于 2009-08-19T18:59:18.303 回答
8

这是一种在同一个 sub 中处理 Button1 和 Button2 点击事件的方法(我最初是一名 VB6 程序员,所以这是 VB6 处理控件数组的一个很好的替代品)

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click
                Select Case True
                    Case sender Is Me.Button1
                        ' Do Button1 stuff '
                    Case sender Is Me.Button2
                        ' Do Button2 stuff '
                End Select
            End Sub
于 2010-05-15T01:32:53.540 回答
5

我永远不会select case true,但你可以这样做:

Select Case msg.GetType.Name
    Case GetType(ClassA).Name
        ...
    Case GetType(ClassB).Name
        ...
    Case Else
        ...
End Select

这比这看起来更干净:

If msg.GetType Is GetType(ClassA) Then
    ...
ElseIf msg.GetType Is GetType(ClassB) Then
    ...
Else
    ...
End If
于 2011-08-11T13:58:11.300 回答
1

这:

Dim a As Object = New TextBox

Select Case True
    Case TypeOf a Is TextBox
        MsgBox("aaa")

    Case TypeOf a Is ComboBox

    Case TypeOf a Is ListBox

End Select
于 2009-08-19T19:00:47.207 回答