我正在构建一个包含一系列方法的库,每个方法都有几个重载,我试图简化它们。
许多方法都有重复出现的过载选项。例如
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
));
这是可能的,如果是这样,那么方法签名会是什么样的?
答案 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
}