2009-10-13 65 views
4

我們有幾個需要同時支持只讀和讀寫模式的域對象;他們目前有一個​​3210屬性 - 當Locked試圖改變對象的屬性導致InvalidOperationException。對象的默認狀態是鎖定。C#3.0對象啓動 - 是否有通知說對象正在被初始化?

C#3的對象初始化語法引入了一個小問題,因爲對象在初始化過程中必須解鎖(或默認爲解鎖),然後在最後鎖定。

當使用C#3的對象初始化語法時,是否存在接收對象正在初始化或初始化完成的通知的方法? System.ComponentModel.ISupportInitialize是我最大的希望,但它並沒有被調用。

回答

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

(你可以集中檢查一如果需要更多的)

+0

這不是我所希望的 - 但是解決了這個問題,否則我將不得不小心設置屬性的順序(假設isFrozen是expo sed的財產)。 var obj = new DomObj(){Frozen = true,Id = 5}; //由於在Id之前設置了Frozen,所以會引發異常。 – STW 2009-10-13 21:14:47

+0

它也避免了讓一個可設置屬性看起來解凍(/解凍)對象的痛苦 - 所以我更喜歡像Freeze()這樣的方法而不是屬性。 – 2009-10-13 21:20:48

3

不,沒有這樣的通知機制。對象初始值設定項功能將簡單地調用指定的構造函數,然後按照它們列出的順序設置可訪問的字段/屬性。沒有可用的接口支持此功能的通知。

2

不。對象初始值設定項只是一個編譯器功能,可以幫助初始化對象。他們直接調用屬性。

您需要強制使用構造函數,或者添加一個「鎖定」方法以明確鎖定它們。