我们有几个域对象需要支持只读和读写模式;它们目前具有bool Locked
属性 - 当Locked
尝试更改对象的属性时会导致InvalidOperationException
。对象的默认状态是Locked。
C#3的对象初始化语法引入了一个小问题,因为在初始化期间必须解锁对象(或默认解锁),然后在结束时明确锁定。
当使用C#3的对象初始化语法时,是否有一种方法可以接收对象正在初始化或初始化完成的通知? System.ComponentModel.ISupportInitialize
是我最大的希望,但它不会被召唤。
答案 0 :(得分:3)
不,没有这样的通知机制。对象初始值设定项功能将简单地调用指定的构造函数,然后按列出的顺序设置可访问的字段/属性。没有可用的界面支持此功能的通知。
答案 1 :(得分: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; }
}
}
(如果需要,你可以将支票集中在一起)
答案 2 :(得分:2)
没有。对象初始化器只是一个编译器功能,可以帮助初始化对象。他们直接致电酒店。
您需要强制使用构造函数,或者添加“lock”方法以显式锁定它们。