Seleccione la caja de un tipo de objeto en VB.NET
-
19-09-2019 - |
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.
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