С методом, который принимает Func<T> в построителе объектов

Я пытаюсь создать Object Builder, чтобы я мог легко создавать объекты для модульного тестирования. Я хотел бы создать метод With(), чтобы я мог передать Func<>, и он установит правильное свойство для меня.

Вот что у меня так далеко:

public class EquipmentModelBuilder
{

    public EquipmentModel Object { get; set; }

    public EquipmentModelBuilder()
    {
        Object = new EquipmentModel();
    }

    public EquipmentModelBuilder WithCategory(int categoryId)
    {
        Object.EquipmentCategoryID = categoryId;
        return this;
    }

    public EquipmentModelBuilder With(Func<EquipmentModel> setter)
    {
        Object = setter.Invoke();
        return this;
    }

    public EquipmentModel Build()
    {
        return Object;
    }
}

Конечно, WithCategory() работает, но я не хочу создавать все методы для каждого свойства, я хотел бы иметь возможность:

EquipmentModelBuilder.With(x => x.Property1 = 1).With(x => x.Property2 = "2").Build()

Есть идеи, что я делаю не так?

2 ответа

Решение

Вам нужно использовать Action<EquipmentModel> в качестве вашего аргумента, а не Func<EquipmentModel>,

public EquipmentModelBuilder With(Action<EquipmentModel> setter)
{
    setter.Invoke(this.Object);
    return this;
}

Я думаю что Func<EquipmentModel> определяет функцию, которая возвращает EquipmentModel, так что вы хотели бы Action<EquipmentModel> которая определяет функцию без возврата, которая принимает EquipmentModel в качестве параметра.

Другие вопросы по тегам