2009-10-13 3 views
4

У нас есть несколько объектов домена, которые должны поддерживать режимы только для чтения и чтения-записи; они в настоящее время имеют свойство bool Locked для этого - когда Locked пытается изменить свойства объекта, результат InvalidOperationException. Состояние по умолчанию для объектов - Locked.C# 3.0 Инициализация объекта - есть ли уведомление о том, что объект инициализируется?

Синтаксис инициализации объекта C# 3 вводит небольшую проблему с этим, поскольку объект должен быть разблокирован (или по умолчанию разблокирован) во время инициализации и затем принудительно заблокирован в конце.

При использовании синтаксиса инициализации объекта C# 3 есть средство получения уведомления о том, что объект инициализирован или завершена инициализация? System.ComponentModel.ISupportInitialize была моей лучшей надеждой, но она не называется.

ответ

3

Вы можете использовать свободно API и добавить его:

var obj = new MyType { Id = 123, Name = "abc"}.Freeze(); 

где метод Freeze возвращает тот же экземпляр (свободно) - что-то вроде:

class MyType { 
    private bool isFrozen; 
    public MyType Freeze() { 
     isFrozen = true; 
     return this; 
    } 
    protected void ThrowIfFrozen() { 
     if (isFrozen) throw new InvalidOperationException("Too cold"); 
    } 
    private int id; 
    public int Id { 
     get { return id; } 
     set { ThrowIfFrozen(); id = value; } 
    } 
    private string name; 
    public string Name { 
     get { return name; } 
     set { ThrowIfFrozen(); name = value; } 
    } 
} 

(можно централизовать проверить бит больше, если необходимо)

+0

Это не то, на что я надеялся, - но решает проблему, которую в противном случае я должен был бы быть осторожным с порядком установки свойств (предполагая isFrozen is expo sed по свойству). var obj = new DomObj() {Frozen = true, Id = 5}; // выдает исключение, так как Frozen был установлен до Id. – STW

+0

Он также избегает боли при наличии настраиваемого свойства, которое, как представляется, размораживает (/ оттаивает) объект - поэтому я предпочитаю метод типа Freeze() ', а не свойство. –

3

Нет, такого механизма уведомления нет. Функция инициализатора объекта просто вызывает указанный конструктор, а затем устанавливает доступные поля/свойства в том порядке, в котором они указаны. Интерфейс недоступен, который поддерживает уведомления для этой функции.

2

Нет. Инициализаторы объектов - это функция компилятора, которая помогает инициализировать ваши объекты. Они называют свойства напрямую.

Вам нужно либо принудительно использовать конструктор, либо добавить метод блокировки, чтобы заблокировать их явно.

 Смежные вопросы

  • Нет связанных вопросов^_^