Passing parameters to delegates in VB.NET
Wrapper class for a Predicate(Of T)
Code:
Public Delegate Function PredicateWrapperDelegate(Of T, A) _
(ByVal item As T, ByVal argument As A) As Boolean
Public Class PredicateWrapper(Of T, A)
Private _argument As A
Private _wrapperDelegate As PredicateWrapperDelegate(Of T, A)
Public Sub New(ByVal argument As A, _
ByVal wrapperDelegate As PredicateWrapperDelegate(Of T, A))
_argument = argument
_wrapperDelegate = wrapperDelegate
End Sub
Private Function InnerPredicate(ByVal item As T) As Boolean
Return _wrapperDelegate(item, _argument)
End Function
Public Shared Widening Operator CType( _
ByVal wrapper As PredicateWrapper(Of T, A)) _
As Predicate(Of T)
Return New Predicate(Of T)(AddressOf wrapper.InnerPredicate)
End Operator
End Class
Generic user class I used for testing.
Code:
Public Class User
Public Sub New(ByVal firstName As String, ByVal lastName As String)
Me._firstName = firstName
Me._lastName = lastName
End Sub
Private _firstName As String
Public Property firstName() As String
Get
Return _firstName
End Get
Set(ByVal value As String)
_firstName = value
End Set
End Property
Private _lastName As String
Public Property lastName() As String
Get
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
End Class
Example usage where I pass a search parameter 'Jim' in for the first name.
Code:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim userList As New List(Of User) _
(New User() {New User("Jim", "Smith"), New User("John", "Doe"), New User("Bill", "Jones")})
Dim searchedUser As User = _
userList.Find(New PredicateWrapper(Of User, String)("Jim", AddressOf FirstNameMatch))
End Sub
Private Function FirstNameMatch(ByVal item As User, ByVal searchArg As String) As Boolean
Return item.firstName.Equals(searchArg)
End Function
End Class