Select Case auf den Typ eines Objekts in VB.NET
-
19-09-2019 - |
Frage
Ich bin mir nicht sicher, ob dies gilt C #, aber hoffentlich bekommen Sie die Idee. :)
switch (msg.GetType()) {
case ClassA:
// blah
case ClassB:
// blah 2
case ClassC:
// blah 3
}
Wie würde ich einschalten den Typ eines Objekts, aber unter Verwendung VB.NET des Select Case
?
Ich bin mir bewusst, dass einige könnte darauf hindeuten, mit Polymorphismus , aber ich bin mit eine Hierarchie von kleinen Nachrichtenklassen, so dass wirklich wäre in meinem Fall nicht funktionieren.
Lösung
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 hat nicht funktioniert, weil Sie nicht zwei Typen mit Gleichheit vergleichen könnten. Sie müßten prüfen, ob sie auf die gleiche Referenz mit dem Schlüsselwort I zeigen. Es ist nicht möglich, dies in einer Select Case zu tun, wenn Sie eine Eigenschaft des Typs wie der Name oder Fullname für den Vergleich verwenden, wie von Michael vorgeschlagen. Sie können eine Kombination von If und ElseIf verwenden aber:
Dim type = msg.GetType()
If type Is GetType(ClassA)
...
ElseIf type Is GetType(ClassB)
...
...
End If
Andere Tipps
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 Leute mögen diese Art der Sache zu vermeiden. If / ElseIf würde wahrscheinlich klarer.
Dies ist eine Möglichkeit, Button1 und Button2 Click-Ereignisse in dem gleichen Unter (I als VB6 Programmierer begann, so ist dies ein guter Ersatz für VB6 Umgang mit Steuer Arrays) zu behandeln
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
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
Welche ist slighly sauberer aus als dies:
If msg.GetType Is GetType(ClassA) Then
...
ElseIf msg.GetType Is GetType(ClassB) Then
...
Else
...
End If
Dieses:
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