Choisir le cas sur le type d'un objet dans VB.NET
-
19-09-2019 - |
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.
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