Select Case del tipo di un oggetto in VB.NET
-
19-09-2019 - |
Domanda
Non sono sicuro se questo C # valido, ma si spera che si ottiene l'idea. :)
switch (msg.GetType()) {
case ClassA:
// blah
case ClassB:
// blah 2
case ClassC:
// blah 3
}
Come faccio a cambiare il tipo di un oggetto ma usando Select Case
di VB.NET?
Sono consapevole che alcuni potrebbero suggerire utilizzando polimorfismo , ma sto usando una gerarchia di classi di messaggi di piccole dimensioni in modo che in realtà non avrebbe funzionato nel mio caso.
Soluzione
Con VB 2010 per progetti destinati NET Framework 4 e versioni successive, è ora possibile fare questo:
Select Case msg.GetType()
Case GetType(ClassA)
End Select
Nelle versioni precedenti di VB, non ha funzionato perché non si poteva confrontare due tipi con l'uguaglianza. Avresti per controllare se sono puntano allo stesso riferimento utilizzando la parola chiave è. Non è possibile farlo in un Select Case, a meno che non si utilizza una proprietà di tipo come il nome o FullName per il confronto, come suggerito da Michael. È possibile utilizzare una combinazione di If e ElseIf però:
Dim type = msg.GetType()
If type Is GetType(ClassA)
...
ElseIf type Is GetType(ClassB)
...
...
End If
Altri suggerimenti
Bene, se ti ostini a usare Select Case, si può sempre andare con:
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
Ma io immagino la maggior parte delle persone, come per evitare questo genere di cose. Se / ElseIf probabilmente sarebbe più chiaro.
Questo è un modo per gestire button1 e button2 click eventi nella stessa sub (ho iniziato come programmatore VB6, quindi questo è un buon sostituto per la gestione di matrici di controlli VB6)
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
Non lo farei mai select case true
, ma si può fare questo:
Select Case msg.GetType.Name
Case GetType(ClassA).Name
...
Case GetType(ClassB).Name
...
Case Else
...
End Select
Che è leggermente più pulita cercando di questo:
If msg.GetType Is GetType(ClassA) Then
...
ElseIf msg.GetType Is GetType(ClassB) Then
...
Else
...
End If
Questa:
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