C# - 使用lambda指定非默认参数

时间:2014-01-25 17:22:32

标签: c# lambda parameter-passing anonymous-function optional-parameters

我正在构建一个包含一系列方法的库,每个方法都有几个重载,我试图简化它们。

许多方法都有重复出现的过载选项。例如

AddString(string option1)
AddString(string option1, int option2)
AddString(string option1, int option2, bool option3)

AddArray(string option1)
AddArray(string option1, int option2)
AddArray(string option1, int option2, bool option3)

现在,我知道我可以将它们指定为默认参数 - 具有指定默认值的参数。我不想这样做,因为我希望默认值可以在项目之间配置,甚至可以从调用者配置到调用者。

我也意识到我可以构建一个具有(可配置)默认值的Options对象,并且用户可以将其实例传递给另一个重载,如此

var options = new Options();
options.OptionProperty1 = "A new string";
AddString(options);

但我更喜欢的是拥有一个静态Options对象,其中包含所有参数的默认值,以某种方式仅指定内联调用中的更改,如此< / p>

AddString(options => options.Set(
                            OptionProperty1 = "A string",
                            OptionProperty2 = 1,
                            OptionProperty3 = true
                        ));

这是可能的,如果是这样,那么方法签名会是什么样的?

1 个答案:

答案 0 :(得分:3)

为了拥有像你一样的Set方法,它必须为你想要设置的每个选项都有一个参数,这可能会在一段时间后变得难以处理,

您可以选择一个流畅的界面,它可以满足您的需求。例如:

class Options
{
  Options Option1(string value)
  {
    m_Option1 = value;
    return this;
  }

  Options Option2(int value)
  {
    m_Option2 = value;
    return this;
  }
}

现在AddString看起来像这样:

AddString(options = > options.Option1("A String").Option2(1)));

AddString的实现如下:

public void AddString(Action<Options> optionConfig)
{
  var options = new Options();
  optionConfig(options);

  // rest of method
}

或者,您可以让调用者创建Options实例。这将允许他们直接设置属性:

class Options
{
  public string Option1{get;set;}
  public int Option2{get;set;}
}

现在来电者可以说:

AddString(() = > new Options{Option1="A String", Option2=1});

AddString看起来像这样:

public AddString(Func<Options> optionsCreator)
{
  Options options = optionsCreator();

  // rest of method
}