是否可以将具有相同返回类型但参数不同的函数发送给另一个函数?

时间:2019-01-27 20:22:01

标签: c#

我有一个AttachmentService.cs类,当前用于将图像上传到数据库和/或云存储容器。当上传到云中时,我有一些重试逻辑,当被两个单独的方法调用时,我想重用这些逻辑。我想将每个函数作为参数传入,然后从它们已传入的方法中调用它们。这是我目前拥有的两个签名:

C#

//Example: I want to be able to pass the first function and also the second
//I'm sure it can done with generics but can't seem to get it currently
private AttachmentUploadResult UploadAttachmentToGLS(Func<string, Guid, byte?[], string, AttachmentUploadResult> uploadFunction)
private AttachmentUploadResult UploadAttachmentToGLS(Func<AttachmentEntity, AttachmentUploadResult> uploadFunction)

我希望上面的代码只有一个签名,可以使用任一签名

Func<string, Guid, byte?[], string, AttachmentUploadResult> uploadFunctionFunc<AttachmentEntity, AttachmentUploadResult> uploadFunction,以便我的方法看起来像这样:

private AttachmentUploadResult UploadAttachmentToGLS(Func<parameters, AttachmentUploadResult>uploadFunction)
{
    //Some retry logic
    uploadFunction(parameters);
    //Some more retry logic
}

有没有一种方法可以达到上述目的?我已经读过Func,但不认为这是使用的正确委托。

1 个答案:

答案 0 :(得分:2)

函数的签名可以仅为Func<AttachmentUploadResult>-您实际上并不关心UploadAttachment方法中的参数,因此应将其关闭。呼叫可能看起来像这样:

Upload(() => SomeUploadMethod(theActual, parameters, toTheMethod));

它还允许您从UploadAttachment方法中隐藏实现的详细信息-您关心的只是“这是我要上传时要调用的函数”。