Select Case on an object's type in VB.NET

63,047

Solution 1

With VB 2010, for projects targeting .NET framework 4 and later, you can now do this:

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

In earlier VB versions, it didn't work because you couldn't compare two types with equality. You'd have to check if they point to the same reference using the Is keyword. It's not possible to do this in a Select Case, unless you use a property of the type like the Name or FullName for comparison, as suggested by Michael. You can use a combination of If and ElseIf though:

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

Solution 2

Well, if you insist on using Select Case, you could always go with:

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

But I would imagine most people like to avoid this kind of thing. If/ElseIf would probably be clearer.

Solution 3

This is a way to handle Button1 and Button2 click events in the same sub (I started out as a VB6 programmer, so this is a good substitute for VB6 handling of control arrays)

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

Solution 4

I wouldn't ever select case true, but you can do this:

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

Which is slighly cleaner looking than this:

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

Solution 5

This:

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
Share:
63,047
mcjabberz
Author by

mcjabberz

VB.NET developer at a local distributor

Updated on July 09, 2022

Comments

  • mcjabberz
    mcjabberz almost 2 years

    I'm not sure if this valid C#, but hopefully you get the idea. :)

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

    How would I switch on an object's type but using VB.NET's Select Case?

    I'm aware that some might suggest using polymorphism, but I'm using a hierarchy of small message classes so that really wouldn't work in my case.

  • MarkJ
    MarkJ over 14 years
    Please do avoid this sort of thing! :)
  • mcjabberz
    mcjabberz over 14 years
    I'm just going to use If/ElseIfs. Kinda sucks that there's not a switch-like way to do it.
  • Bernesto
    Bernesto over 12 years
    It may be more sightly, but is also about a hundred times slower too. But it would get the job done if he really wants to do it that way.
  • Mr Shoubs
    Mr Shoubs over 12 years
    @Bernesto - A hundred times slower than what? This answer is the same as the accepted answer (I don't have 2010 to test the performance of type equality). I don't believe it should be a -1??
  • Aravinth
    Aravinth almost 12 years
    To be specific, this will only work in .Net Framework 4 and later. Type.Equality Operator
  • Airn5475
    Airn5475 over 11 years
    You can take this with a grain of salt and do your own perf testing: My own simple performance test of If/ElseIf vs Select Case proved the If/ElseIf option was faster every time. The Select Case took roughly 4 times as long. I'll stick with If/ElseIf for now.
  • lb.
    lb. over 10 years
    If Type.Name is not a fully qualified type name there may be a conflict if two classes have the same name but are in different namespaces.
  • lb.
    lb. over 10 years
    I am ambivalent on this one if the block is short. What would be the argument against this section of code?
  • Germán Martínez
    Germán Martínez over 10 years
    Actually this does not seem bad at all, especially when you might have multiple cases (fall-through) - this would look MILES better than if statements...
  • rheitzman
    rheitzman over 8 years
    I prefer CASE over nested IFs - much more readable and less error prone IMO. I use SELECT CASE True ... often, works great.
  • user3085342
    user3085342 over 6 years
    Thanks - this allows for more succinct / easier-to-read code when checking for 2 different types in same comparison eg Case GetType(ClassA), GetType(ClassB) vs Elseif typeof obj is ClassA or typeof obj is ClassB then
  • Tom Lint
    Tom Lint about 6 years
    @MrShoubs "A hundred times slower than what?" You do realize that, unlike the accepted answer, which just compares Type instances, your answer creates strings for each of them and compares those, instead?