Select Case True

后端 未结 9 1815
失恋的感觉
失恋的感觉 2020-11-27 07:08

Apparently this used to be a way in VB6 and VBA to short circuit and execute the first true case:

Select Case True
End Select

Is this still

9条回答
  •  被撕碎了的回忆
    2020-11-27 07:33

    You can define Equals Operator on any Wrapper Type. Then you can use Wrapper type on Select Case.

    Sample Wrapper.

    Imports System.Runtime.InteropServices
     Friend Module Util
      Public Function _Is(v As Object) As IsWrapper
          Return New IsWrapper With {.Obj = v}
      End Function
      Public Structure IsWrapper
         Public Obj As Object
         Public Shared Operator =(ByVal a As IsWrapper, ByVal b As Object) As Boolean
             Return a.Obj Is b
         End Operator
         Public Shared Operator <>(ByVal a As IsWrapper, ByVal b As Object) As Boolean
             Return a.Obj IsNot b
         End Operator
      End Structure
    End Module
    

    Now you can use _is(AnyObject):

    Private Sub RbClass_CheckedChanged(sender As System.Object, e As System.EventArgs)
        If DirectCast(sender, RadioButton).Checked = False Then Return
        Select Case _Is(sender)
            Case RbClass : Rb = 0
            Case RbTablePredicate : Rb = 1
            Case RbTableRowFilter : Rb = 2
        End Select
        QueryCtl1_QueryChanged(Nothing, Nothing)
    End Sub
    
    Public Sub Predicate(ByVal PredicateType As Type, ByVal Op As Operadores, ByVal Obj As Object, ByVal CompareOptions As CompareOptions, ByVal Fnc As [Delegate])
       Dim pred As [Delegate] = Nothing
       Select Case _Is(PredicateType)
          Case GetType(Boolean)
              pred = New Predicate(Of Boolean)(Function(v) v)
          Case GetType(String)
              pred = StrPredicate(Op, Obj, CompareOptions)
          Case Else 'Utilizar Generics
              pred = GenericHelper.Builder(PredicateType).Predicate(Op, Obj)
       End Select
       Predicate(pred, Fnc)
    End Sub
    

    About Performance. Release Code is optimized. Wrapper has no performance penalty.

提交回复
热议问题