4

読み取り専用モードと読み書きモードの両方をサポートする必要があるいくつかのドメイン オブジェクトがあります。現在、オブジェクトのプロパティを変更しようとするとbool Locked、. オブジェクトのデフォルトの状態は Locked です。LockedInvalidOperationException

C# 3 のオブジェクト初期化構文では、初期化中にオブジェクトをロック解除 (または既定でロック解除) し、最後に明示的にロックする必要があるという小さな問題が発生します。

C# 3 のオブジェクト初期化構文を使用する場合、オブジェクトが初期化されている、または初期化が完了したという通知を受け取る手段はありますか? System.ComponentModel.ISupportInitialize私の最善の希望でしたが、呼び出されませんでした。

4

3 に答える 3

3

いいえ、そのような通知メカニズムはありません。オブジェクト初期化機能は、指定されたコンストラクターを呼び出すだけで、アクセス可能なフィールド/プロパティをリスト順に設定します。この機能の通知をサポートする利用可能なインターフェイスはありません。

于 2009-10-13T19:37:00.933 に答える
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; }
    }
}

(必要に応じて、チェックをもう少し集中化できます)

于 2009-10-13T19:48:13.220 に答える
2

いいえ。オブジェクト初期化子は、オブジェクトの初期化を支援するコンパイラ機能です。プロパティを直接呼び出します。

コンストラクターの使用を強制するか、「ロック」メソッドを追加して明示的にロックする必要があります。

于 2009-10-13T19:38:15.627 に答える