2009-08-19 6 views
36

No estoy seguro de si este C# válido, pero con suerte usted consigue la idea. :)Seleccione el caso en el tipo de un objeto en VB.NET

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

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

Soy consciente de que algunos pueden sugerir el uso de polymorphism, pero estoy usando una jerarquía de clases de mensajes pequeños para que realmente no funcione en mi caso.

Respuesta

69

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 con dos tipos igualdad. Debería verificar si apuntan a la misma referencia usando la palabra clave Is. No es posible hacer esto en un Caso Selecto, a menos que use una propiedad del tipo como el Nombre o Nombre Completo para la comparación, como lo sugiere 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 
+0

sólo voy a usar '' If'/ElseIf's. Es una lástima que no haya una forma de cambio para hacerlo. – mcjabberz

+1

Para ser específico, esto solo funcionará en .Net Framework 4 y posterior. [Operador de tipo.Equality] (http://msdn.microsoft.com/en-us/library/system.type.op_equality.aspx) – Jon

+2

Puede tomar esto con un grano de sal y hacer sus propias pruebas de rendimiento: Mi propio la simple prueba de rendimiento de 'If/ElseIf' vs' Select Case' demostró que la opción 'If/ElseIf' era más rápida cada vez. El 'Seleccionar caso' tomó aproximadamente 4 veces más tiempo. Me quedaré con 'If/ElseIf' por ahora. – Airn5475

20

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 la mayoría de la gente le gusta para evitar este tipo de cosas Si/ElseIf probablemente sería más claro.

+10

¡Por favor, evita este tipo de cosas! :) – MarkJ

+2

Soy ambivalente en este caso si el bloque es corto. ¿Cuál sería el argumento en contra de esta sección de código? –

+6

En realidad, esto no parece malo en absoluto, especialmente cuando puede tener múltiples casos (fallido) - esto se vería MILES mejor que declaraciones if ... –

1

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 
6

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 el manejo de VB6 de matrices de control)

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 
+0

¡bastante elegante! ¡y funciona! – KnF

4

yo no siempre 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 

whic h 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 
+0

Puede ser más a la vista, pero también es unas cien veces más lento también. Pero haría el trabajo si realmente quiere hacerlo de esa manera. – Bernesto

+0

@Bernesto: ¿cien veces más lento que qué? Esta respuesta es la misma que la aceptada (no tengo 2010 para probar el rendimiento de la igualdad de tipo). No creo que deba ser un -1? –

+0

Si Type.Name no es un nombre de tipo completo, puede haber un conflicto si dos clases tienen el mismo nombre pero están en espacios de nombres diferentes. –

Cuestiones relacionadas