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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top