Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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 get called.

like image 274
STW Avatar asked Mar 01 '23 04:03

STW


2 Answers

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)

like image 125
Marc Gravell Avatar answered Mar 02 '23 17:03

Marc Gravell


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.

like image 20
JaredPar Avatar answered Mar 02 '23 18:03

JaredPar