Мой вопрос основан на этой статье.
В принципе класс может реализовать метод Freezable, чтобы убедиться, что никакие свойства не могут быть изменены после того, как объект входит в состояние Frozen.
У меня есть интерфейс, который следует за этой конструкцией
public interface IFreezableModel
{
void Freeze();
bool IsFrozen{get;}
}
цель состоит в том, чтобы убедиться, что после вызова метода Freeze свойство IsFrozen имеет значение True и свойства объекта больше не могут быть изменены.
Чтобы упростить, я буду использовать абстрактный базовый класс:
public abstract class BaseFreezableModel : IFreezableModel
{
public void Freeze()
{
_isFrozen = true;
}
public bool IsFrozen
{
get {return _isFrozen;}
}
protected ThrowIfFrozen()
{
if (IsFrozen)
throw new Exception("Attempted to change a property of a frozen model");
}
}
Таким образом, у меня может быть класс вроде
public class MyModel : BaseFreezableModel
{
private string _myProperty;
public string MyProperty
{
get{return _myProperty;}
set
{
ThrowIfFrozen();
_myProperty = value;
}
}
}
Это все хорошо и просто, но какую стратегию я могу принять, чтобы убедиться, что все свойства следуют шаблону выше? (помимо написания сеттеров и геттеров)
Это альтернативы, которые я придумал:
-
Найдите механизм для ввода метода в каждый набор свойств, используя, возможно, испускающий. Но я не знаю, как это сделать, с какими потенциальными проблемами я могу столкнуться (и, следовательно, сколько времени это займет). Если кто-то знает это и может указать мне в этом направлении, это было бы здорово.
-
Используйте некоторые шаблоны во время процесса сборки, чтобы "Call to OnCheckFrozen" был вставлен непосредственно перед компиляцией. Преимущество этого заключается в том, что он действительно прост для понимания и может работать для подобных сценариев.
-
Найдите фреймворк, который может сделать все это для меня, но это так же, как крайний случай, поскольку мне не разрешено использовать внешнюю инфраструктуру для этого проекта.
Какие решения вы бы использовали для этого?