using System.Collections.Generic;
using System.Threading.Tasks;
namespace Creational.Builder2
public class Builder : PersonJobBuilder<Builder>
public static Builder New => new Builder();
public override string ToString()
return $"{nameof(Name)}: {Name}, {nameof(Position)}: {Position}";
public abstract class PersonBuilder
protected Person person = new Person();
public class PersonInfoBuilder<SELF> : PersonBuilder
where SELF : PersonInfoBuilder<SELF>
public SELF Called(string name)
public class PersonJobBuilder<SELF> : PersonInfoBuilder<SELF>
where SELF : PersonJobBuilder<SELF>
public SELF WorksAsA(string position)
person.Position = position;
public static void Main()
var builder = new Person.Builder();
var person = builder.WorksAsA("d");
Console.WriteLine(person);