使用额外参数传递委托函数

Bob*_*son 11 c# delegates

我有一个委托,如下所示:

public delegate bool ApprovalPrompt(ApprovalType type, int receipt, params string[] info);
Run Code Online (Sandbox Code Playgroud)

我接受这种类型的委托作为我想要调用的函数的参数.但是,在一个特定的调用函数中,我想将一些额外的数据传递给与该委托匹配的函数.

这是实现功能的签名:

private static bool LogApprovalNeeded(FraudFilterUtilities.ApprovalType type, int receipt, params string[] info)
Run Code Online (Sandbox Code Playgroud)

它被称为如下:

PrepareReceipt(LogApprovalNeeded);
Run Code Online (Sandbox Code Playgroud)

我希望它是:

private static bool LogApprovalNeeded(Customer cust, FraudFilterUtilities.ApprovalType type, int receipt, params string[] info)
Run Code Online (Sandbox Code Playgroud)

理想情况下使用如下:

PrepareReceipt(LogApprovalNeeded(myCustomer))
Run Code Online (Sandbox Code Playgroud)

我怎么能完成这样的事情呢?我宁愿不需要在类中声明一个字段只是为了Customer在一个函数和回调之间保存参数......

Ser*_*rvy 21

你可以使用lambda"curry"你的函数:

PrepareReceipt((type, receipt, info) => 
    LogApprovalNeeded(myCustomer, type, receipt, info))
Run Code Online (Sandbox Code Playgroud)

卷曲函数是用于存储对函数的引用但是具有一个或多个参数"固定"的形式术语,因此改变了该方法的签名.

当函数的签名不需要委托提供的所有参数时,您也可以使用lambda; 你可以通过不传递lambda中的所有参数来有效地丢弃参数.


Mir*_*Mir 6

您可以使用 lambda 来实现您的需求。

PrepareReceipt((type, receipt, info) =>
               LogApprovalNeeded(myCustomer, type, receipt, info));
Run Code Online (Sandbox Code Playgroud)

或者,将您的LogApprovalNeeded签名更改为:

static bool LogApprovalNeeded(ApprovalType type, int receipt, 
                              Customer cust = null, params string[] info)
{
}
Run Code Online (Sandbox Code Playgroud)

但考虑到您已经在cust.

编辑:正如 Servy 正确指出的那样,签名的更改不会让您按照您的描述调用该方法。如果移动相关的逻辑CustomerPrepareReceipt,不过,你不需要使用上面的方法(这基本上产生新的匿名方法和包装myCustomer在一个封闭。