web-dev-qa-db-fra.com

Sélectionnez Case sur le type d'un objet dans VB.NET

Je ne sais pas si ce C # valide, mais j'espère que vous avez l'idée. :)

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

Comment activer le type d'un objet mais en utilisant le Select Case De VB.NET?

Je suis conscient que certains pourraient suggérer d'utiliser polymorphisme , mais j'utilise une hiérarchie de petites classes de messages afin que cela ne fonctionne vraiment pas dans mon cas.

40
mcjabberz

Avec VB 2010, pour les projets ciblant .NET Framework 4 et versions ultérieures, vous pouvez désormais le faire:

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

Dans les versions précédentes de VB, cela ne fonctionnait pas car vous ne pouviez pas comparer deux types avec l'égalité. Vous devez vérifier s'ils pointent vers la même référence à l'aide du mot clé Is. Ce n'est pas possible de le faire dans un cas de sélection, sauf si vous utilisez une propriété du type comme le nom ou le nom complet pour comparaison, comme suggéré par Michael. Vous pouvez cependant utiliser une combinaison de If et ElseIf:

Dim type = msg.GetType()
If type Is GetType(ClassA)
    ...
ElseIf type Is GetType(ClassB)
    ...
...
End If
72
Meta-Knight

Eh bien, si vous insistez pour utiliser Select Case, vous pouvez toujours choisir:

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

Mais j'imagine que la plupart des gens aiment éviter ce genre de chose. Si/ElseIf serait probablement plus clair.

20
Dan Tao

C'est un moyen de gérer les événements de clic Button1 et Button2 dans le même sous-marin (j'ai commencé en tant que programmeur VB6, c'est donc un bon substitut pour la gestion VB6 des tableaux de contrôle)

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

Je ne serais jamais select case true, mais vous pouvez le faire:

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

Ce qui est légèrement plus propre que celui-ci:

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

Cette:

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
1
Fredou