Инициализация объекта C # 3.0. Есть ли уведомление о том, что объект инициализируется? - PullRequest
4 голосов
/ 13 октября 2009

У нас есть несколько доменных объектов, которые должны поддерживать режимы «только чтение» и «чтение и запись»; в настоящее время они имеют свойство bool Locked для этого - когда Locked попытка изменить свойства объекта приводит к InvalidOperationException. Состояние по умолчанию для объектов - Заблокировано.

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

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

Ответы [ 3 ]

3 голосов
/ 13 октября 2009

Вы можете использовать свободный 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; }
    }
}

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

3 голосов
/ 13 октября 2009

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

2 голосов
/ 13 октября 2009

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

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

...