Есть ли простой способ сделать экземпляр неизменным?
Давайте сделаем пример, у меня есть класс, содержащий множество полей данных (только данные, никакого поведения):
class MyObject
{
// lots of fields painful to initialize all at once
// so we make fields mutable :
public String Title { get; set; }
public String Author { get; set; }
// ...
}
Пример создания:
MyObject CreationExample(String someParameters)
{
var obj = new MyObject
{
Title = "foo"
// lots of fields initialization
};
// even more fields initialization
obj.Author = "bar";
return obj;
}
Но теперь, когда я полностью создал свой объект, я больше не хочу, чтобы объект изменялся (потому что потребителю данных никогда не понадобится изменять состояние), поэтому мне хотелось бы что-то вроде этого List.AsReadOnly:
var immutableObj = obj.AsReadOnly();
Но если я хочу этого поведения, мне нужно сделать еще один класс, который имеет точно такие же поля, но без setter.
Итак, есть ли какой-либо автоматический способ создания этого неизменяемого класса? Или другой способ разрешить изменчивость во время создания, но неизменяемый после инициализации?
Я знаю, что поля могут быть помечены как "readonly", но объект будет инициализирован вне класса, и передача всех полей в качестве параметров конструктора кажется плохой идеей (слишком много параметров).