Создание универсального шаблона компоновщика для классов без конструктора без параметров - PullRequest
0 голосов
/ 14 сентября 2018

Мы пытаемся реализовать шаблон компоновщика расширяемым способом, который не зависит от наших разработчиков, кодирующих компоновщик напрямую, используя общий шаблон With (т. Е. Каждое открытое поле имеет метод WithX(...) для компоновщика).

Мы видели потенциальный шаблон, использующий лямбда-выражения для изменения, уменьшающий компоновщик до общей функции With, которая затем применяет лямбда-выражения при вызове Build.

Однако,Все реализации такого шаблона предполагают, что создаваемый объект должен иметь конструктор без параметров и общедоступные сеттеры.

Объекты, которые мы пытаемся построить, не имеют ни общедоступных сеттеров, ни конструкторов без параметров.

Например, наши классы выглядят так:

public class Class1
{
    public int field { get; }

    public Class1(int field)
    {
        this.field = field;
    }
}

Наш конструктор обычно выглядит так:

public class Class1Builder
{
    private int _field;

    public Class1Builder()
    {
        this._field = 1;
    }

    public Class1Builder WithField(int field)
    {
        _field = field;
        return this;
    }

    public Class1 Build()
    {
        return new Class1(_field);
    }
}

Мы хотели бы преобразовать метод With во что-то, что могло бы позволить использование:

var class1 = new Class1Builder.With(x => x.Field = 3).Build();

Есть ли способ сделать такое?

...