【问题标题】:C# 3.0 Object Initialation - Is there notification that the object is being initialized?C# 3.0 对象初始化 - 是否有对象正在初始化的通知?
【发布时间】:2010-12-06 10:55:59
【问题描述】:

我们有几个领域对象需要同时支持只读和读写模式;他们目前有一个bool Locked 属性——当Locked 尝试更改对象的属性时会导致InvalidOperationException。对象的默认状态是锁定。

C# 3 的对象初始化语法引入了一个小问题,即对象必须在初始化期间解锁(或默认解锁),然后在最后显式锁定。

当使用 C# 3 的对象初始化语法时,是否有一种方法可以接收对象正在初始化或初始化已完成的通知? System.ComponentModel.ISupportInitialize 是我最大的希望,但它没有被调用。

【问题讨论】:

    标签: c# .net object-initializers


    【解决方案1】:

    您可以使用流畅的 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; }
        }
    }
    

    (如果需要,您可以更集中检查)

    【讨论】:

    • 这不是我所希望的——但它解决了我必须注意设置属性的顺序的问题(假设 isFrozen 由属性公开)。 var obj = new DomObj() { Frozen = true, Id = 5 }; // 由于 Frozen 设置在 Id 之前,因此引发异常。
    • 它还避免了具有似乎解冻(/解冻)对象的可设置属性的痛苦 - 所以我更喜欢 Freeze() 这样的方法而不是属性。
    【解决方案2】:

    不,没有这样的通知机制。对象初始化器功能将简单地调用指定的构造函数,然后按照列出的顺序设置可访问的字段/属性。没有可用的接口支持此功能的通知。

    【讨论】:

      【解决方案3】:

      没有。对象初始化器只是帮助初始化对象的编译器功能。他们直接调用属性。

      您需要强制使用构造函数,或者添加“锁定”方法来显式锁定它们。

      【讨论】:

        猜你喜欢
        • 2018-02-10
        • 2013-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多