带有大量可选参数的c# API要求所有参数都有值

本文关键字:参数 API | 更新日期: 2023-09-27 18:12:39

我怀疑这将是一个容易的修复,但是…这是一个方法的(费力的)API…

public void Add(int StyleIn = 0, string DefaultValueIn = "",
  string ComboListValuesIn = "", string MinIn = "", string MaxIn = "",
  int MaxLengthIn = -1, bool HighlightIn = false,
  string StartDateIn = "", string EndDateIn = "", string MethodIn = "",
  string AccountIn = "", string AmountTypeIn = "", bool PositiveIn = true,
  int ResultTypeIn = -1, DtaColumn DtaColIn = null)

所有好吗?当我试着把它叫做…

DC.Add(dbEditText, "Property", , , , , , , , , , , , , DC);

它告诉我每一个空参数都缺失了。我仔细数过了,都在。如果我用"代替空的,然后它开始工作…所以它忽略了其他选项吗?

如果你想知道,这段代码是从VS转换过来的

带有大量可选参数的c# API要求所有参数都有值

在本例中,您需要将最后一个参数命名为:

DC.Add(dbEditText, "Property", DtaColIn: DC);

这是一个非常丑陋的API!你不能在c#中传递空值,这就是为什么你试图在你的问题中使用空字符串和逗号失败的原因。有两种方法可以解决这个问题。

  1. 为每个"空白"值传递null
  2. 使用命名参数

当你有可选参数时,你可以传递一个值,也可以传递空值。只有当以下所有参数都使用默认值时,您才可以将它们留空。

允许:

DC.Add(dbEditText, "property");
DC.Add(dbEditText, "property", null, null, null, null, null, "something");

这不是:

DC.Add(dbEditText,"property",,"something");

请注意,在允许的示例中,"property"参数之后的任何内容都将使用默认值。然而,在您的情况下,您想要设置一些"随机"参数的值。这是使用命名参数时的情况。使用@EldarDordzhiev的例子:

DC.Add(dbEditText, "property", DtaColIn: DC);

这允许您首先使用有序参数(当参数名称未指定时),但不能跳过任何内容。当您想跳过某些参数时,可以开始使用命名参数。这将允许为该特定参数设置指定的值。任何缺少的可选项将被设置为默认值。

我会考虑稍微重构一下代码,并引入一个命令对象类,它将封装所有参数,然后使用该类作为方法的参数:

public class ApiParameters{
    public int StyleIn {get; set;}
    public string {get; set;}
    public string {get; set;}
    public string {get; set;}
    public string {get; set;}
}

,然后:DC.Add(ApiParameters params);

由于Eldar提出的解决方案是正确的,这使得代码更容易阅读。

这是因为如果你要为任何可选参数传递一个值,那么所有可选参数都需要传递某种值

从MSDN:

可选参数定义在参数列表的末尾,在任何必需参数之后。如果调用方为一系列可选参数中的任何一个提供参数,则必须为前面的所有可选参数提供参数。参数列表中不支持逗号分隔的空格。

正如@user1666620所提到的,如果您使用最后一个参数的Name并将其作为命名参数传递,那么您可以省略中间以逗号分隔的空参数列表。