Pergunta

Eu não tenho certeza se este válido C #, mas espero que você começa a idéia. :)

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

Como eu iria ligar um tipo de objeto mas usando Select Case de VB.NET?

Estou ciente de que alguns poderiam sugerir o uso polimorfismo , mas eu estou usando uma hierarquia de classes de mensagens pequenas para que realmente não iria funcionar no meu caso.

Foi útil?

Solução

Com VB 2010, para projetos voltados para .NET framework 4 e mais tarde, agora você pode fazer isso:

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

Em versões anteriores do VB, não funcionou porque você não poderia comparar dois tipos com igualdade. Você teria que verificar se eles apontam para a mesma referência usando o é palavra-chave. Não é possível fazer isso em um Select Case, a menos que você usar uma propriedade do tipo como o nome ou FullName para comparação, como sugerido por Michael. Você pode usar uma combinação de Se e ElseIf no entanto:

Dim type = msg.GetType()
If type Is GetType(ClassA)
    ...
ElseIf type Is GetType(ClassB)
    ...
...
End If

Outras dicas

Bem, se você insistir em usar Select Case, você poderia sempre ir com:

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

Mas eu imagino a maioria das pessoas gostaria de evitar esse tipo de coisa. Se / ElseIf provavelmente seria mais clara.

Esta é uma maneira de lidar com Button1 e Button2 eventos de clique na mesma sub (I começou como um programador VB6, então isso é um bom substituto para VB6 manipulação de matrizes de controle)

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

Eu não iria nunca select case true, mas você pode fazer isso:

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

Qual é slighly mais limpo do que olhar o seguinte:

If msg.GetType Is GetType(ClassA) Then
    ...
ElseIf msg.GetType Is GetType(ClassB) Then
    ...
Else
    ...
End If

Este:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top