Выбрать регистр для типа объекта в VB.NET - PullRequest
40 голосов
/ 19 августа 2009

Я не уверен, что это допустимый C #, но, надеюсь, вы поняли идею. :)

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

Как бы я включил тип объекта, но используя VB.NET Select Case?

Я знаю, что некоторые могут предложить использовать полиморфизм , но я использую иерархию небольших классов сообщений, так что в моем случае это не сработает.

Ответы [ 5 ]

72 голосов
/ 19 августа 2009

В VB 2010 для проектов, нацеленных на .NET Framework 4 и более поздние версии, теперь вы можете сделать следующее:

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

В более ранних версиях VB это не работало, потому что вы не могли сравнить два типа с равенством. Вам нужно проверить, указывают ли они на одну и ту же ссылку, используя ключевое слово Is. Это невозможно сделать в случае выбора, если только вы не используете для сравнения свойство типа типа Name или FullName, как предложено Майклом. Вы можете использовать комбинацию If и ElseIf, хотя:

Dim type = msg.GetType()
If type Is GetType(ClassA)
    ...
ElseIf type Is GetType(ClassB)
    ...
...
End If
20 голосов
/ 19 августа 2009

Ну, если вы настаиваете на использовании 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

Но я бы предположил, что большинству людей нравится избегать подобных вещей. Если / ElseIf, вероятно, будет яснее.

7 голосов
/ 15 мая 2010

Это способ обработки событий нажатия кнопок 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
4 голосов
/ 11 августа 2011

Я бы никогда не 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
1 голос
/ 19 августа 2009

Это:

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
...