开发者

C# 3.0 Object Initialation - Is there notification that the object is being initialized?

开发者 https://www.devze.com 2022-12-08 05:09 出处:网络
We have several domain objects which need to support both read-only and read-write modes; they currently have a bool Locked property for this--when Locked attempts to alter properties on the object re

We have several domain objects which need to support both read-only and read-write modes; they currently have a bool Locked property for this--when Locked attempts to alter properties on the object result in an InvalidOperationException. The default state for the objects is Locked.

The object-initialization syntax of C# 3 introduces a small issue with these, in that the object must be unlocked (or default to be unlocked) during initialization and then locked explicityly at the end.

When using C# 3's object initialization syntax is there a means of receiving notification that the object is being intitialized or that initialization is complete? System.ComponentModel.ISupportInitialize was my best hope, but it doesn't g开发者_开发知识库et called.


You could use a fluent API and append it:

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

where the Freeze method returns the same instance (fluent) - something like:

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

(you could centralize the check a bit more if needed)


No, there is no such notification mechanism. The object initializer feature will simply call the specified constructor and then set the accessible fields / properties in the order they are listed. There is no interface available which supports notifications for this feature.


No. The object initializers just are a compiler feature to assist in initializing your objects. They call the properties directly.

You need to either force constructor usage, or add a "lock" method to lock them down explicitly.

0

精彩评论

暂无评论...
验证码 换一张
取 消