Question

Je ne sais pas si cela valide C #, mais nous espérons que vous avez l'idée. :)

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

Comment puis-je passer sur le type d'un objet, mais en utilisant la Select Case de VB.NET?

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

Était-ce utile?

La solution

Avec VB 2010, pour des projets ciblant le framework .NET 4 et versions ultérieures, vous pouvez maintenant faire ceci:

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

Dans les versions VB antérieures, il ne fonctionne pas parce que vous ne pouviez pas comparer deux types d'égalité. Il faudrait vérifier si elles conduisent à la même référence en utilisant le mot-clé est. Il est impossible de le faire dans un Select Case, sauf si vous utilisez une propriété du type comme le nom ou FullName à titre de comparaison, comme le suggère Michael. Vous pouvez utiliser une combinaison de Si et ElseIf si:

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

Autres conseils

Eh bien, si vous insistez sur l'utilisation de Select Case, vous pouvez toujours aller avec:

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 je suppose, la plupart des gens aiment éviter ce genre de chose. Si / ElseIf serait probablement plus clair.

Ceci est un moyen de gérer les événements et cliquez sur Button1 Bouton2 dans le même sous (j'ai commencé en tant que programmeur VB6, donc c'est un bon substitut pour le traitement VB6 des tableaux de commande)

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

Je voudrais jamais select case true, mais vous pouvez faire ceci:

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

Ce qui est à la recherche slighly plus propre que ceci:

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

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top