4

我们有几个领域对象需要同时支持只读和读写模式;他们目前有一个bool Locked属性——当Locked尝试更改对象上的属性时会导致InvalidOperationException. 对象的默认状态是锁定。

C# 3 的对象初始化语法引入了一个小问题,因为对象必须在初始化期间解锁(或默认解锁),然后在最后显式锁定。

当使用 C# 3 的对象初始化语法时,是否有一种方法可以接收对象正在初始化或初始化已完成的通知? System.ComponentModel.ISupportInitialize是我最大的希望,但它没有被调用。

4

3 回答 3

3

不,没有这样的通知机制。对象初始化器功能将简单地调用指定的构造函数,然后按照列出的顺序设置可访问的字段/属性。没有可用的接口支持此功能的通知。

于 2009-10-13T19:37:00.933 回答
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; }
    }
}

(如果需要,您可以集中检查更多)

于 2009-10-13T19:48:13.220 回答
2

不,对象初始化器只是一个编译器功能,可帮助初始化您的对象。他们直接调用属性。

您需要强制使用构造函数,或者添加“锁定”方法来明确锁定它们。

于 2009-10-13T19:38:15.627 回答