Pregunta

No estoy seguro si esto válido C #, pero esperamos que pueda hacerse una idea. :)

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

¿Cómo puedo cambiar el tipo de un objeto, pero utilizando Select Case de VB.NET?

Soy consciente de que algunos podrían sugerir el uso de polimorfismo , pero estoy usando una jerarquía de clases pequeñas mensaje de modo que realmente no funcionaría en mi caso.

¿Fue útil?

Solución

Con VB 2010, para proyectos dirigidos a .NET Framework 4 y posterior, ahora se puede hacer esto:

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

En versiones anteriores de VB, no funcionó porque no se podía comparar dos tipos con la igualdad. Habría que comprobar si apuntan a la misma referencia usando la palabra clave es. No es posible hacer esto en un Select Case, a menos que utilice una propiedad del tipo como el nombre o NombreCompleto para la comparación, según lo sugerido por Michael. Se puede utilizar una combinación de Si y ElseIf sin embargo:

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

Otros consejos

Bueno, si usted insiste en el uso de Select Case, siempre se puede ir 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

Pero me imagino que la mayoría de la gente le gusta para evitar este tipo de cosas. Si / ElseIf probablemente sería más claro.

Esta es una manera de manejar Button1 y Button2 eventos de clic en la misma sub (Empecé como un programador de Visual Basic 6, por lo que este es un buen sustituto para la manipulación de matrices de control de 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

No me he select case true, pero se puede hacer esto:

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

¿Qué es ligeramente más limpia buscando que esto:

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

Este:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top