我有一个委托,如下所示:
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中的所有参数来有效地丢弃参数.
您可以使用 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 正确指出的那样,签名的更改不会让您按照您的描述调用该方法。如果移动相关的逻辑Customer来PrepareReceipt,不过,你不需要使用上面的方法(这基本上产生新的匿名方法和包装myCustomer在一个封闭。