具有许多可选参数的C#API需要所有参数中的值

时间:2015-09-14 20:43:43

标签: c#

我怀疑这将是一个简单的解决方案,但是......这是方法的(实用的)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转换。

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

  1. 为每个"空白"传递runApplication
  2. 使用Named Arguments
  3. 每当有可选参数时,您可以传递值,也可以传递null。只有以下所有参数都将使用默认值时才能将它们留空。

    这是允许的:

    null

    这不是:

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

    注意在允许的例子中," property"的参数之后是怎么回事将使用默认值。但是,在您的情况下,您希望将某个值设置为某些随机的'参数。这是您使用命名参数时。使用@ EldarDordzhiev的例子:

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

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

答案 2 :(得分:0)

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

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提出的解决方案是正确的,这个使代码更容易阅读。

答案 3 :(得分:0)

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

来自MSDN

  

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

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