2009-08-19 17 views
36

Ich bin nicht sicher, ob diese gültige C#, aber hoffentlich bekommen Sie die Idee. :)Wählen Sie Case auf einen Objekttyp in VB.NET

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

Wie würde ich auf eine Objekttyp wechseln, aber VB.NET ist Select Case mit?

Ich bin mir bewusst, dass einige vorschlagen, polymorphism zu verwenden, aber ich verwende eine Hierarchie von kleinen Nachrichtenklassen, so dass wirklich in meinem Fall nicht funktionieren würde.

Antwort

69

Mit VB 2010 für Projekte, die sich .NET Framework 4 und höher können Sie dies jetzt tun:

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

In früheren VB-Versionen, es nicht funktioniert, weil Sie nicht zwei Arten vergleichen könnte mit Gleichberechtigung. Sie müssten prüfen, ob sie mit dem Schlüsselwort Is auf dieselbe Referenz verweisen. Dies ist in einem Select Case nicht möglich, es sei denn, Sie verwenden eine Eigenschaft des Typs wie Name oder FullName zum Vergleich, wie von Michael vorgeschlagen. Sie können eine Kombination von If und ElseIf obwohl verwenden:

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

Ich werde nur 'If' /' ElseIf's verwenden. Irgendwie nervt es, dass es keine switch-artige Möglichkeit gibt, es zu tun. – mcjabberz

+1

Um genau zu sein, wird dies nur in .Net Framework 4 und höher funktionieren. [Type.Equality Operator] (http://msdn.microsoft.com/en-us/library/system.type.op_equality.aspx) – Jon

+2

Sie können dies mit einem Körnchen Salz nehmen und Ihre eigenen Perf-Tests durchführen: Meine eigenen Der einfache Performancetest von 'If/ElseIf' gegen' Select Case' bewies, dass die 'If/ElseIf'-Option jedes Mal schneller war. Das 'Select Case' hat ungefähr 4 mal so lange gedauert. Ich bleibe bei 'If/ElseIf' für jetzt. – Airn5475

20

Nun, wenn Sie sich mit Select Case bestehen, könnte man immer gehen mit:

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 

Aber ich könnte mir vorstellen, die meisten Menschen vermeiden möchten so etwas. Wenn/ElseIf wäre wahrscheinlich klarer.

+10

Bitte vermeiden Sie diese Art von Sache! :) – MarkJ

+2

Ich bin ambivalent, wenn der Block kurz ist. Was wäre das Argument gegen diesen Codeabschnitt? –

+6

Eigentlich scheint das überhaupt nicht schlecht, besonders wenn Sie mehrere Fälle (Durchfall) haben - das würde MILES besser aussehen als wenn Anweisungen ... –

1

Diese:

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

Dies ist ein Weg, Button1 und Button2 Click-Ereignisse in dem gleichen Unter (I begann als VB6-Programmierer, so ist dies ein guter Ersatz für VB6 Umgang mit Steuer Arrays) zu handhaben

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

ziemlich elegant! und es funktioniert! – KnF

4

ich würde nicht immer select case true, aber Sie können dies tun:

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

whic h sieht etwas sauberer aus als das:

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

Es mag etwas anschaulicher sein, ist aber auch etwa hundertmal langsamer. Aber es würde den Job erledigen, wenn er es wirklich so machen will. – Bernesto

+0

@Bernesto - Hundertmal langsamer als was? Diese Antwort ist die gleiche wie die angenommene Antwort (Ich habe 2010 nicht, um die Leistung der Typgleichheit zu testen). Ich glaube nicht, dass es ein -1 ?? –

+0

Wenn Type.Name kein vollständig qualifizierter Typname ist, liegt möglicherweise ein Konflikt vor, wenn zwei Klassen denselben Namen haben, sich jedoch in unterschiedlichen Namespaces befinden. –

Verwandte Themen