在C#中自动创建构造函数

时间:2015-10-19 23:23:37

标签: c# visual-studio resharper

我只是想知道是否有一种自动生成构造函数的方法,可能需要您可能需要的所有参数组合。

我有一个带有4个参数的ctor,但是我想提供重载,开发人员可以传入一个或两个或三个参数。我手工编写了所有可能的组合并将默认值传递给4参数。我还需要再介绍两个" full"原型(第五个),然后为那些创建所有可能的组合,所以我需要加载ctor重载来覆盖所有组合。

我想手动编写三个完整的ctors,然后能够通过单击上下文菜单生成组合。我还没有在Resharper看到这样的选项。任何人都知道现有解决方案是否存在?

3 个答案:

答案 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可以包含StringintBar的任意组合:

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();

这完全消除了对指数个构造函数的需求。