Код: Выделить всё
public class MyImmutableClass
{
public int MyInteger { get; }
public string MyString { get; }
private MyImmutableClass(int myInteger, string myString)
{
this.MyInteger = myInteger;
this.MyString = myString;
}
public static MyImmutableClass Empty()
=> new MyImmutableClass(0, "");
public MyImmutableClass WithMyInteger(int newMyInteger)
=> new MyImmutableClass(newMyInteger, this.MyString);
public MyImmutableClass WithMyString(string newMyString)
=> new MyImmutableClass(this.MyInteger, newMyString);
}
Код: Выделить всё
var x = MyImmutableClass.Empty().WithMyInteger(12).WithMyString("Hello");
Проблема в том, что каждое свойство требует немалого обслуживания. Для каждого свойства, которое я хочу добавить, мне нужно внести эти изменения...
- Добавьте новое свойство get вверху.
Частному конструктору нужен новый параметр. - Частному конструктору необходимо установить для нового свойства значение нового параметра.
- Функция Empty должна предоставить значение по умолчанию для нового параметра конструктора.
- Каждая из уже существующих функций «With» должна добавить this.NewProperty , чтобы скопировать значение свойства старого объекта в новое.
- Напишите новую функцию WithNewProperty, которая копирует все значения свойств существующего объекта в частный конструктор вместе с новым значением параметра.
Может ли мне помочь современный C#? Есть ли способ определить этот шаблон неизменяемого класса с набором свойств, и я считаю, что описанное выше обслуживание полностью автоматическое?
(Функция MemberwiseClone досадно завершен и не имеет варианта «кроме этого».)
Подробнее здесь: https://stackoverflow.com/questions/784 ... unctions-t