我只是想知道是否有一种自动生成构造函数的方法,可能需要您可能需要的所有参数组合。
我有一个带有4个参数的ctor,但是我想提供重载,开发人员可以传入一个或两个或三个参数。我手工编写了所有可能的组合并将默认值传递给4参数。我还需要再介绍两个" full"原型(第五个),然后为那些创建所有可能的组合,所以我需要加载ctor重载来覆盖所有组合。
我想手动编写三个完整的ctors,然后能够通过单击上下文菜单生成组合。我还没有在Resharper看到这样的选项。任何人都知道现有解决方案是否存在?
答案 0 :(得分:2)
如果你需要很多构造函数参数,而不是挣扎于可能的排列的爆炸性,那么考虑创建一个"选项"具有合理默认值的类:
public class FooOptions
{
public FooOptions()
{
MaintenanceInterval = TimeSpan.FromSeconds(30);
MaximumIdleTime = TimeSpan.FromMinutes(5);
}
public TimeSpan MaintenanceInterval { get; set; }
public TimeSpan MaximumIdleTime { get; set; }
//etc...
}
然后
class Foo
{
public Foo():this(new FooOptions())
{
}
public Foo(FooOptions opts)
{
//...
}
}
答案 1 :(得分:1)
不需要多个构造函数重载 - 尝试使用optional / default参数。相关链接:https://msdn.microsoft.com/en-us/library/dd264739.aspx
示例代码:
class Program
{
static void Main(string[] args)
{
var defaultMonster = new Monster();
var archerMonster = new Monster("crossbow");
var knightMonster = new Monster("broadsword", "plate mail");
var wizardMonster = new Monster(armor: "wizard robe", magicItem: "wand");
Console.WriteLine(defaultMonster);
Console.WriteLine(archerMonster);
Console.WriteLine(knightMonster);
Console.WriteLine(wizardMonster);
}
}
class Monster
{
private readonly string _weapon;
private readonly string _armor;
private readonly string _magicItem;
public Monster(string weapon = "scimitar", string armor = "leather", string magicItem = "nothing")
{
_weapon = weapon;
_armor = armor;
_magicItem = magicItem;
}
public override string ToString()
{
return string.Format("Monster armed with {0}, wearing {1}, carrying {2}", _weapon, _armor, _magicItem);
}
}
答案 2 :(得分:1)
这种情况非常适合Builder
模式。
例如,如果课程Foo
可以包含String
,int
和Bar
的任意组合:
public class Foo
{
public string MyString { get; set; }
public int MyInt { get; set; }
public Bar MyBar { get; set; }
}
不要添加具有各种可能性的构造函数,而是创建Builder
。以下是一个简单流畅的实现示例:
public class FooBuilder
{
private Foo foo = new Foo();
public FooBuilder WithString(String someString)
{
foo.MyString = someString;
return this;
}
public FooBuilder WithInt(int someInt)
{
foo.MyInt = someInt;
return this;
}
public FooBuilder WithBar(Bar someBar)
{
foo.MyBar = someBar;
return this;
}
public Foo Build()
{
return foo;
}
}
可以这样使用:
Foo foo = new FooBuilder().WithString("abc").WithInt(3).Build();
这完全消除了对指数个构造函数的需求。