public string Field1 { get; set; }
public int Field2 { get; set; }
public string Field1 { get; set; }
public int Field2 { get; set; }
public interface IProductFieldBuilder<T>
public class ProductFieldBuilder1 : IProductFieldBuilder<string>
public string BuildField() => "Field1";
public class ProductFieldBuilder2 : IProductFieldBuilder<int>
public int BuildField() => 1;
public class ProductBuilderBase
protected event Action<ProductDto, Product> actions;
public Product BuildProduct(ProductDto productDto)
var product = new Product();
actions?.Invoke(productDto, product);
public class ProductBuilder1 : ProductBuilderBase
public ProductBuilder1(IProductFieldBuilder<string> b1, IProductFieldBuilder<int> b2)
actions += (x, y) => y.Field1 = b1.BuildField();
actions += (x, y) => y.Field2 = b2.BuildField();
public class ProductBuilder2 : ProductBuilderBase
public ProductBuilder2(IProductFieldBuilder<string> b1)
actions += (x, y) => y.Field1 = b1.BuildField();
public static void Main()
var dto = new ProductDto();
var pb1 = new ProductBuilder1(new ProductFieldBuilder1(), new ProductFieldBuilder2());
var r1 = pb1.BuildProduct(dto);
var pb2 = new ProductBuilder2(new ProductFieldBuilder1());
var r2 = pb2.BuildProduct(dto);