参数数量不同的代表

问题描述 投票:0回答:1

我编写了一个DLL,该DLL可以调用我无法访问的第三方API。

由于用户如何退出并重新启动应用程序,每种方法在检查访问令牌和刷新令牌方面都有很多逻辑,以便通过API进行身份验证。 (以及错误处理处理)这导致每个不同的API调用都有很多重复的代码。

我想对此进行重构,因此我可以将我想要的响应对象的类型传递给名为ExecuteApiCall的通用方法。然后可以仅针对特定的REST调用而调用适当的方法。

我用以下签名创建了此方法:

private T ExecuteApiCall<T>(string name, Action<T> requestCall) where T : IApiResponse, new()

并且这按我期望的那样工作。我现在遇到的问题是,一些请求需要额外的参数,而我无法将不同数量的参数传递给Action委托。

我该如何处理?

我当时打算改成

Action<T, ApiRequestParameters>

其中ApiRequestParameters是所有可能参数的类,并且面向公共的方法可以在调用私有ExecuteApiCall之前设置所需的参数。但这并不是真正的最佳实践。

我真的希望这对某人有意义,并在此先感谢。如果需要,很高兴提供更多的代码示例。

以下需要处理

ExecuteCallA()
{
    //The API call is done here using RestSharp
}

ExecuteCallB(string aParameter)
{
    //The API call is done here using RestSharp
}

ExecuteCallC(string aParameters, int anotherParameter)
{
    //The API call is done here using RestSharp
}

或者只是将Action设置为如下所示会更容易。

Action<T, object, object, object>

以便它可以处理其他参数,而忽略不需要的任何参数。

c# generics delegates
1个回答
0
投票

我将为一定数量的参数添加重载。例如:

private T ExecuteApiCall<T>(string name, Action<T> requestCall) where T : IApiResponse, new();

private T ExecuteApiCall<P1, T>(string name, P1 p1, Action<P1, T> requestCall) where T : IApiResponse, new()

private T ExecuteApiCall<P1, P2, T>(string name, P1 p1, P2 p2, Action<P1, P2, T> requestCall) where T : IApiResponse, new()

// etc

实现有点重复,但是一旦完成,您就可以将其忘掉,它会使您向用户公开的API更加整洁和可预测。

© www.soinside.com 2019 - 2024. All rights reserved.