Sélectionnez Case sur le type d’un object dans VB.NET

Je ne suis pas sûr 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 allumer un type d’object en utilisant le Select Case VB.NET?

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

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

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

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

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

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

 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 choses. Si / ElseIf serait probablement plus clair.

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, donc c’est un bon substitut à 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 

Je ne select case true 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 

Qui est légèrement plus propre que cela:

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

Ce:

 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