【发布时间】:2019-08-16 07:51:30
【问题描述】:
我在一个 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 个引用。谢谢!
【问题讨论】:
-
你不能真正做到这一点。 params 参数必须是形式参数列表中的最后一个参数。但是,向方法添加参数,即使是可选参数也是一项重大更改。可以说,最好简单地添加一个具有新名称的新方法,该方法采用新参数,然后跟随一个可选参数列表。
-
可以不使用可选参数,而是使用方法重载和创建方法:
protected Task EnvGetJsonAsync<TReceive>(string endpointName, string id, param object[] pathArgs,)。在内部,这两种方法都可以调用相同的私有方法,并且您不会破坏现有的引用。 -
@AnkitVijay 虽然这是合法的,但我会注意到这可能会导致行为的细微变化,具体取决于 id 参数在方法中的作用。想象一下我有
EnvGetJsonAsync<Type>("endpointname", 'path/arg")。 pathArgs 是一个包含一项的数组。当我使用新库重新编译时,重载解析选择了不同的方法,id 为“path/arg”,pathArgs 为空。如果 id 参数在语义上不同,则可能需要一种新方法。 -
嗨 @mjwills 和 Mike,我的写作速度比我想象的要快。谢谢你纠正我:)
标签: c#