Wrapper class for a Predicate(Of T) (C#版本)@H_404_3@
public delegate bool PredicateWrapperDelegate<T,A>(T item,A argument);
public class PredicateWrapper<T,A>
{
private A _argument;
private PredicateWrapperDelegate<T,A> _wrapperDelegate;@H_404_3@
public PredicateWrapper(A argument,PredicateWrapperDelegate<T,A> wrapperDelegate)
{
_argument = argument;
_wrapperDelegate = wrapperDelegate;
}@H_404_3@
private bool InnerPredicate(T item)
{
return _wrapperDelegate(item,_argument);
}
public static implicit operator Predicate<T>(PredicateWrapper<T,A> wrapper)
{
return new Predicate<T>(wrapper.InnerPredicate);
}@H_404_3@
}
Wrapper class for a Predicate(Of T) (vb.net版本)@H_404_3@
Code:
@H_404_3@
Public Delegate Function PredicateWrapperDelegate(Of T,A) _
(ByVal item As T,ByVal argument As A) As Boolean@H_404_3@
Public Class PredicateWrapper(Of T,A)@H_404_3@
Private _argument As A
Private _wrapperDelegate As PredicateWrapperDelegate(Of T,A)@H_404_3@
Public Sub New(ByVal argument As A,_
ByVal wrapperDelegate As PredicateWrapperDelegate(Of T,A))@H_404_3@
_argument = argument
_wrapperDelegate = wrapperDelegate
End Sub@H_404_3@
Private Function InnerPredicate(ByVal item As T) As Boolean
Return _wrapperDelegate(item,_argument)
End Function@H_404_3@
Public Shared Widening Operator CType( _
ByVal wrapper As PredicateWrapper(Of T,A)) _
As Predicate(Of T)@H_404_3@
Return New Predicate(Of T)(AddressOf wrapper.InnerPredicate)
End Operator@H_404_3@
End Class@H_404_3@
Generic user class I used for testing.@H_404_3@
Code:
@H_404_3@
Public Class User@H_404_3@
Public Sub New(ByVal firstName As String,ByVal lastName As String)
Me._firstName = firstName
Me._lastName = lastName
End Sub@H_404_3@
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@H_404_3@
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@H_404_3@
End Class@H_404_3@
Example usage where I pass a search parameter 'Jim' in for the first name.@H_404_3@
Code:
@H_404_3@
Public Class Form1@H_404_3@
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@H_404_3@
Private Function FirstNameMatch(ByVal item As User,ByVal searchArg As String) As Boolean
Return item.firstName.Equals(searchArg)
End Function@H_404_3@
End Class@H_404_3@