基于VB.NET中的标志调用不同的字符串方法

时间:2014-03-28 18:26:16

标签: vb.net

我希望能够根据参数中传递的内容调用不同的String方法。例如,我的参数是“%XYZ%”。如果XYZ两边都有百分号,那么代码中我想说SomeString.Contains("XYZ").

如果只有XYZ左侧有百分号,那么我想说的代码

SomeString.EndsWith("XYZ").

理想情况下,我想要这样的事情:

   With objSearchTerms             
    If Not String.IsNullOrEmpty(.ProjectName) Then                       
     If .ProjectName.StartsWith("%") AndAlso .ProjectName.EndsWith("%") Then                           
         'MyStringMethod = Contains
     ElseIf .ProjectName.EndsWith("%") Then
         'MyStringMethod = StartsWith
     ElseIf .ProjectName.StartsWith("%") Then
         'MyStringMethod = EndsWith
     Else
         'MyStringMethod = Equals
     End If
    End If
   End With

然后我想进一步说:

 filingList = filingRepository.GetList (Function(e) e.SERFFTrackingToFilings.Any(Function(x) x.SERFFTracking.Number.*MyStringMethod*(objTerms.TrackingNumber)) 

谢谢。

2 个答案:

答案 0 :(得分:0)

如果您对要运行该方法的字符串有引用,那么您可以将该方法分配给Func<T, TResult>委托,并调用委托,例如。

Dim MyStringMethod As Func(Of String, Boolean)
'...
MyStringMethod = AddressOf(SomeString.Contains)
'...
Dim result As Boolean = MyStringMethod(SomeOtherString)    'SomeString.Contains(SomeOtherString)

但看起来您的SomeString处于匿名函数中,您可能尚未对其进行引用。可能的解决方法:

Dim MyStringMethod As Func(Of String, String, Boolean)
'...if...
MyStringMethod = Function(a As String, b As String) a.Contains(b)
'...else if...
MyStringMethod = Function(a As String, b As String) a.StartsWith(b)
'...etc.
 filingList = filingRepository.GetList (Function(e) e.SERFFTrackingToFilings.Any(Function(x) MyStringMethod(x.SERFFTracking.Number, objTerms.TrackingNumber)))

答案 1 :(得分:0)

我最终做了以下事情:

我创建了一个模块:

 Module StringExtensions

    <Extension()>
    Public Function ProcessString(ByVal strToCheck As String, ByVal strOperand As String, ByVal strWhatTocheck As String) As Boolean
        Select Case strOperand
            Case "Contains"
                Return strToCheck.Trim.ToUpper.Contains(strWhatTocheck.Trim.ToUpper)
            Case "StartsWith"
                Return strToCheck.Trim.ToUpper.StartsWith(strWhatTocheck.Trim.ToUpper)
            Case "EndsWith"
                Return strToCheck.Trim.ToUpper.Contains(strWhatTocheck.Trim.ToUpper)
            Case "Equals"
                Return strToCheck.Trim.ToUpper.Equals(strWhatTocheck.Trim.ToUpper)
            Case Else
                Throw New ApplicationException("Can't match ProcessString(). ")
        End Select
    End Function

End Module

然后在调用方法中我使用了这样的模块:

       Dim filingListDTO As New List(Of DTO.FilingDetailsViewModel)
       Dim strNumberOperand As String = ""
       Dim strProjectNumber As String = ""   

  With model
     If Not String.IsNullOrEmpty(.ProjectNumber) Then
                If .ProjectNumber.StartsWith("%") AndAlso .ProjectNumber.EndsWith("%") Then
                    strNumberOperand = "Contains"
                ElseIf .ProjectNumber.EndsWith("%") Then
                    strNumberOperand = "StartsWith"
                ElseIf .ProjectNumber.StartsWith("%") Then
                    strNumberOperand = "EndsWith"
                Else
                    strNumberOperand = "Equals"
                End If
                strProjectNumber = .ProjectNumber.Replace("%", "").Trim.ToUpper
                .ProjectNumber = strProjectNumber
            End If
   End With

       filingListDTO = (From f In <<someList>>
                             Where f.ProjectNumber.ProcessString(strNumberOperand, strProjectNumber) _
                             Select f).ToList