Selecione caso sobre um tipo de objeto em VB.NET
-
19-09-2019 - |
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.
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