public static void Main()
Foo foo2 = Foo.Create("value1", "value2");
public interface IDualValues<T>
public class Foo : DualValuesBuilder<string, Foo>
public class DualValuesBuilder<T, CreatedType> : IDualValues<T> where CreatedType : class, IDualValues<T>
public T FirstValue { get; init; }
public T SecondValue { get; init; }
public static CreatedType Create(T firstValue, T secondValue)
return (CreatedType)DualValuesBuilderHelper<T>.Create<CreatedType>(firstValue, secondValue);
public class DualValuesBuilderHelper<T> : IDualValues<T>
public T FirstValue { get; init; }
public T SecondValue { get; init; }
private protected DualValuesBuilderHelper(T firstValue, T secondValue)
SecondValue = secondValue;
public static IDualValues<T> Create<ReturnType>(T developerK8SClusterValue, T octopusValue)
where ReturnType : IDualValues<T>
return new DualValuesBuilderHelper<T>(developerK8SClusterValue, octopusValue);