2009-10-13 67 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

不。对象初始值设定项只是一个编译器功能,可以帮助初始化对象。他们直接调用属性。

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