在参数params object []之后添加可选参数

时间:2019-03-26 01:14:49

标签: c#

我在API中有一个函数,很多其他库都在使用该函数,但是我想将其改编为新功能,以增加一个可选参数。方法签名为:

protected Task EnvGetJsonAsync<TReceive>(string endpointName, params object[] pathArgs)

,我想在pathArgs之后添加“ string key = null”,因为我有37个对此函数的引用,用于该格式。这样我就不必更改所有37个引用(而且大多数引用都不需要使用可选参数),我只想在最后添加一个可选参数。

我尝试将“ params object []”更改为“ object []”,但所有引用均导致错误。所以看起来像这样

protected Task EnvGetJsonAsync<TReceive>(string endpointName, params object[] pathArgs, string id = null)

然后是

protected Task EnvGetJsonAsync<TReceive>(string endpointName, object[] pathArgs, string id = null)

但两者都引起了问题。我想要一种允许函数采用可选参数而不破坏其他37个引用的方法。谢谢!

3 个答案:

答案 0 :(得分:2)

根据文档,您不能在params之后有可选参数:

  

在方法声明中的params关键字之后不允许使用其他参数,在方法声明中仅允许一个params关键字。

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/params

您可以在params之前放置可选参数 ,但是,由于您的params数组类型是object,您可能会遇到运行时错误选择如果您的第一个pathArgs类型是string,则错误的方法。

最好的方法是使用一个稍微不同的名称为您的可选参数添加一个新方法。如果您的参考方法具有或没有密钥,则可以使用适当的方法。然后,您可以使用旧键或键的默认值从旧版本调用新方法:

protected Task EnvGetJsonAsync<TReceive>(string endpointName, params object[] pathArgs)
{
    return EnvGetJsonWithKeyAsync<TReceive>(endpointName, null, pathArgs);
}

protected Task EnvGetJsonWithKeyAsync<TReceive>(string endpointName, string key, params object[] pathArgs)
{
    // your method here
}

答案 1 :(得分:1)

您可以将可选参数移到param之前。按照MSDN

  

在   方法声明,并且在一个方法中仅允许使用一个params关键字   方法声明。

最好为新输入创建新方法,并根据输入可以从那里调用现有方法。

param的重载将不起作用。您不会收到任何编译时错误。它将在运行时调用最后一个方法。您可以查看此fiddler了解更多信息。

答案 2 :(得分:0)

只需创建一个新方法,将实现移到该位置,然后使用旧方法调用新方法即可。这样,您的37个呼叫者将永远不会注意到更改:

protected Task EnvGetJsonAsync<TReceive>(string endpointName, params object[] pathArgs)
{
  // this is the original method. Here we just call the new one
  return EnvGetJsonoAsync<TReceive>(endpointName, null, pathArgs);
}

protected Task EnvGetJsonAsync<TReceive>(string endpointName, string id, params object[] pathArgs) 
{
  .. the code implementation
}