How to create immutable types without writing a large amount of boilerplate code. : csharp