.net 在声明时为Func指定一个参数,在调用/执行时为Func指定另一个参数

.net 在声明时为Func指定一个参数,在调用/执行时为Func指定另一个参数,.net,vb.net,generics,delegates,func,.net,Vb.net,Generics,Delegates,Func,从我的研究中,我没有发现任何证据表明这是可能的,所以我想知道是否有一种方法可以做到这一点或下一个最干净的解决方案 我希望避免将另一个参数传递给我的泛型函数,以保持它的整洁并改进模块性 考虑以下通用循环函数,该函数在循环集合时调用谓词函数检查特定条件: Private Sub LoopAndApplyCondition(Of T)(ByVal collection As IDataCollection, ByVal condition As Func(Of T, String, Boolean),

从我的研究中,我没有发现任何证据表明这是可能的,所以我想知道是否有一种方法可以做到这一点或下一个最干净的解决方案

我希望避免将另一个参数传递给我的泛型函数,以保持它的整洁并改进模块性

考虑以下通用循环函数,该函数在循环集合时调用谓词函数检查特定条件:

Private Sub LoopAndApplyCondition(Of T)(ByVal collection As IDataCollection, ByVal condition As Func(Of T, String, Boolean), ByRef result As List(Of T))
  If Not collection.ActiveItems Is Nothing And collection.Count > 0 Then
    For Each record In collection
   '***
   '*** I would like to pass in the record into the predicate function here ***
   '***
        Dim meetsCondition As Boolean = condition.Invoke(CType(record, T))
        If meetsCondition Then result.Add(CType(record, T))
    Next
  End If
End Sub
这就是定义谓词函数(条件)并调用此通用循环函数的内容,它具有attributeName字段,这是我希望传递到谓词函数中的内容

Public Function AllEditableRecords(Of T)(ByVal collection As IDataObjectCollection, ByVal attributeName As String) As List(Of T)
    Dim result As New List(Of T)
    '***
    '*** I would like to pass in the attributeName field to the predicate function here ***
    '***
    Dim condition As Func(Of T, String, Boolean) = AddressOf CheckIfRecordIsEditable
    LoopAndApplyCondition(Of T)(collection, condition, result)
  Return result
End Function
这是谓词函数的签名:

Private Function CheckIfRecordIsEditable(Of T)(record As T, attributeName As String) As Boolean
  'Returns conditionResult
End Function
总之,我想通过AllEditableRecords函数将字符串参数传递给CheckIfRecordIsEditable,并通过LoopAndApplyCondition将通用的record参数传递给

我认为这是不可能的,但请证明我错了。
我也很乐意接受C#中的答案,但我更喜欢VB.NET。

不,在声明代理时无法定义代理的参数

但是,可以将Func及其参数封装在自己的类中:

Public Class RecordCondition(Of T)
    Public Property CheckConditionHandler As Func(Of T, String, Boolean)
    Public Property AttributeName As String
End Class
AllEditableRecords中创建
RecordCondition

Public Function AllEditableRecords(Of T)(ByVal collection As IDataObjectCollection, ByVal attributeName As String) As List(Of T)
    Dim result As New List(Of T)

    Dim recordCondition As New RecordCondition(Of T) With {.CheckConditionHandler = AddressOf CheckIfRecordIsEditable, .AttributeName=attributeName}
    LoopAndApplyCondition(Of T)(collection, recordCondition, result)
    Return result
End Function
Private Sub LoopAndApplyCondition(Of T)(ByVal collection As IDataCollection, ByVal condition As RecordCondition(Of T), ByRef result As List(Of T))
    If Not collection.ActiveItems Is Nothing And collection.Count > 0 Then
        For Each record In collection
            Dim meetsCondition As Boolean = condition.CheckConditionHandler(record, condition.AttributeName) 
            If meetsCondition Then result.Add(CType(record, T))
        Next
    End If
End Sub
循环和应用条件中调用
CheckConditionHandler

Public Function AllEditableRecords(Of T)(ByVal collection As IDataObjectCollection, ByVal attributeName As String) As List(Of T)
    Dim result As New List(Of T)

    Dim recordCondition As New RecordCondition(Of T) With {.CheckConditionHandler = AddressOf CheckIfRecordIsEditable, .AttributeName=attributeName}
    LoopAndApplyCondition(Of T)(collection, recordCondition, result)
    Return result
End Function
Private Sub LoopAndApplyCondition(Of T)(ByVal collection As IDataCollection, ByVal condition As RecordCondition(Of T), ByRef result As List(Of T))
    If Not collection.ActiveItems Is Nothing And collection.Count > 0 Then
        For Each record In collection
            Dim meetsCondition As Boolean = condition.CheckConditionHandler(record, condition.AttributeName) 
            If meetsCondition Then result.Add(CType(record, T))
        Next
    End If
End Sub

CheckIfRecordIsEditable不会更改。

否,在声明委托时无法为委托定义参数

但是,可以将Func及其参数封装在自己的类中:

Public Class RecordCondition(Of T)
    Public Property CheckConditionHandler As Func(Of T, String, Boolean)
    Public Property AttributeName As String
End Class
AllEditableRecords中创建
RecordCondition

Public Function AllEditableRecords(Of T)(ByVal collection As IDataObjectCollection, ByVal attributeName As String) As List(Of T)
    Dim result As New List(Of T)

    Dim recordCondition As New RecordCondition(Of T) With {.CheckConditionHandler = AddressOf CheckIfRecordIsEditable, .AttributeName=attributeName}
    LoopAndApplyCondition(Of T)(collection, recordCondition, result)
    Return result
End Function
Private Sub LoopAndApplyCondition(Of T)(ByVal collection As IDataCollection, ByVal condition As RecordCondition(Of T), ByRef result As List(Of T))
    If Not collection.ActiveItems Is Nothing And collection.Count > 0 Then
        For Each record In collection
            Dim meetsCondition As Boolean = condition.CheckConditionHandler(record, condition.AttributeName) 
            If meetsCondition Then result.Add(CType(record, T))
        Next
    End If
End Sub
循环和应用条件中调用
CheckConditionHandler

Public Function AllEditableRecords(Of T)(ByVal collection As IDataObjectCollection, ByVal attributeName As String) As List(Of T)
    Dim result As New List(Of T)

    Dim recordCondition As New RecordCondition(Of T) With {.CheckConditionHandler = AddressOf CheckIfRecordIsEditable, .AttributeName=attributeName}
    LoopAndApplyCondition(Of T)(collection, recordCondition, result)
    Return result
End Function
Private Sub LoopAndApplyCondition(Of T)(ByVal collection As IDataCollection, ByVal condition As RecordCondition(Of T), ByRef result As List(Of T))
    If Not collection.ActiveItems Is Nothing And collection.Count > 0 Then
        For Each record In collection
            Dim meetsCondition As Boolean = condition.CheckConditionHandler(record, condition.AttributeName) 
            If meetsCondition Then result.Add(CType(record, T))
        Next
    End If
End Sub

CheckIfRecordIsEditable不会更改。

是的,我同意,这可能是维护封装的下一个最好方法,谢谢!是的,我同意,这可能是保持封装的第二个最好的方法,谢谢!