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

4
我们有几个域对象需要支持只读和读写模式;它们目前具有一个名为 bool Locked 的属性--当 Locked 尝试更改对象上的属性时会导致 InvalidOperationException。对象的默认状态为已锁定。
C# 3 的对象初始化语法引入了一个小问题,即对象必须在初始化期间解锁(或默认解锁),然后在最后显式锁定。
在使用 C# 3 的对象初始化语法时,是否有一种方法可以接收到对象正在被初始化或初始化完成的通知?System.ComponentModel.ISupportInitialize 是我最好的希望,但它不会被调用。
3个回答

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; }
    }
}

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

这不是我所期望的,但它解决了一个问题,否则我必须小心设置属性的顺序(假设isFrozen由属性公开)。var obj = new DomObj() { Frozen = true, Id = 5 }; // 抛出异常,因为在设置Id之前已经设置了Frozen。 - STW
它还避免了具有可设置属性的痛苦,该属性似乎会解冻对象 - 因此我更喜欢像Freeze()这样的方法,而不是属性。 - Marc Gravell

3

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


2

不。对象初始化器只是编译器的一个功能,用于辅助初始化对象。它们直接调用属性。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接