Чтобы иметь неизменный класс , сначала нужно убедиться, что свойства недоступны извне . Поэтому я бы изменил его на:
class MyClass
{
public int Property1 { get; }
public string Property2 { get; }
public MyClass(int prp1, string prp2)
{
Property1 = prp1;
Property2 = prp2;
}
public MyClass With(int? property1 = default, string property2 = default) =>
new MyClass(property1 ?? Property1, property2 ?? Property2);
}
Это уже хорошая отправная точка. Как вы сказали, использование дженериков может означать чрезмерную разработку кода для проблемы, которую вы пытаетесь решить.
Некоторые люди предпочитают использовать один метод для каждого свойства, которое вы хотите изменить, объединяя вызовы, если они хотят изменить несколько свойств. Это может выглядеть немного более многословно, но обычно приводит к более чистому классу.
Это будет выглядеть так:
class MyClass
{
// until here it is the same as before
public MyClass WithPrp1(int prp1) => new MyClass(prp1,Property2);
public MyClass WithPrp2(string prp2) => new MyClass(Property1,prp2);
}
class Program
{
static void Main()
{
var myObj = new MyClass(123, "123");
var myModifiedObj = myObj.WithPrp1(456).WithPrp2("789");
}
}