具有大量可选参数的C#API要求所有参数中都有值

具有大量可选参数的C#API要求所有参数中都有值,c#,C#,我怀疑这将是一个简单的解决办法,但。。。下面是一个方法的(费力的)API public void Add(int StyleIn = 0, string DefaultValueIn = "", string ComboListValuesIn = "", string MinIn = "", string MaxIn = "", int MaxLengthIn = -1, bool HighlightIn = false, string StartDateIn = "", stri

我怀疑这将是一个简单的解决办法,但。。。下面是一个方法的(费力的)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转换而来的。

在这种情况下,您需要将最后一个参数命名为:

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参数)


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

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

  • 为每个“空白”值传递
    null
  • 使用
  • 只要有可选参数,就可以传递值或传递null。如果以下所有参数都将使用默认值,则只能将其留空

    这是允许的:

    DC.Add(dbEditText, "property");
    DC.Add(dbEditText, "property", null, null, null, null, null, "something");
    
    这不是:

    DC.Add(dbEditText,"property",,"something");
    
    请注意,在允许的示例中,“property”参数之后的任何内容都将使用默认值。但是,在您的情况下,您希望为一些“随机”参数设置一个值。这是在使用命名参数时发生的。以@eldardorzhiev为例:

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

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

    这是因为,如果要为任何可选参数传递一个值,则该参数之前的所有可选参数都需要传递某种类型的值

    发件人:

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


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

    显式地将每个参数设置为null?这看起来是一个完美的解决方案。如果中间有空格,或者只有最后一个空格,我应该把它们全部命名吗?但是我更喜欢把它们全部命名,混合命名和未命名的参数是一种不好的做法。我发现C#和VB之间的差异相当令人惊讶。这是其中一个惊喜——API在VB中运行良好。这就是生活!给它们命名似乎是最好的解决办法。