C#3.0对象初始化 - 是否有通知正在初始化对象?

时间:2009-10-13 19:34:55

标签: c# .net object-initializers

我们有几个域对象需要支持只读和读写模式;它们目前具有bool Locked属性 - 当Locked尝试更改对象的属性时会导致InvalidOperationException。对象的默认状态是Locked。

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

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

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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; }
    }
}

(如果需要,你可以将支票集中在一起)

答案 2 :(得分:2)

没有。对象初始化器只是一个编译器功能,可以帮助初始化对象。他们直接致电酒店。

您需要强制使用构造函数,或者添加“lock”方法以显式锁定它们。