コンビニや「怠惰なプログラミング」のIList管理 - 保護IList.Add方法

StackOverflow https://stackoverflow.com/questions/554159

  •  23-08-2019
  •  | 
  •  

質問

あなたがアイテムのリストでオブジェクトを持っているとき、あなたはこの単純なシナリオを管理するにはどうすればよいです。 EGます:

public class ContainerObject
{
    IList<ChildObject> Children { get; }

    public void AddCustom(ChildObject toAdd)
    {
        // Some validation ...
        Children.Add(toAdd);
    }
}

コレクションはのIListの実装に初期化されると仮定すると、項目がリストに追加される方法を制御するにはどのような方法があるのでしょうか?

たとえば、私はChildObjectを取り、リストに追加ContainerObjectクラスの別のメソッドを持っています。この方法は、それを追加する前にChildObject上のいくつかの基本的な検証を行う必要がある。

私は私の周り混乱したいと消費の開発者が実装する必要があること(addメソッドなし)カスタムリストのインタフェースを記述しないで怠けています。これは、IListのに固執もう一つの理由であるように、私はまたのIQueryableインターフェイスでToListメソッド()メソッドを使用しています - 。それだけで動作します。

だから、あなたはAddメソッドを使用することを防ぐ、すなわちIListのインスタンスに追加し、唯一の私のカスタムメソッドを経由してコレクションに加えることができ、または私はちょうど不可能を求めていますされているかのアイテム取り締まることが可能なアプローチがありますか? ...と怠けている:(

の項目が追加されたとき、私は私のカスタムメソッドを介して、または直接リストを確認するには、いくつかのハック方法を考えることができますが、これらはハックようだ!

誰もがこれに似た何かを経験しますか?もしそうなら、あなたは何をした?

役に立ちましたか?

解決

これはあなたのリストを包む世界に ReadOnlyCollection に戻ります追加を管理します。

他のヒント

あなたは ReadOnlyCollection<T> <あなたの財産を使用して、元のリストの周りにラッパーを返すことができます/>。これは、発信者が任意の項目に自分自身を追加しないことを保証します。あなたは、元の変更可能なリストへの参照を保持することができます。読み取り専用のコレクションが唯一のラッパーであるため、読み取り専用のコレクションをキャッシュ発信者がまだあなたが元のリストに加える追加を参照されることに注意してください。それは、あなたや予想される用途に応じて良いことをしてもしなくてもよい。

編集:私のキャッシングのコメントを説明するために...

クライアントがしたと仮定します:

IList<ChildObject> originalChildren = container.Children;    
container.AddChild(new ChildObject());
IList<ChildObject> updatedChildren = container.Children;    

このように実装Childrenプロパティを使用してます:

private IList<ChildObject> children = new List<ChildObject>();
public IList<ChildObject> Children
{
    get { return new ReadOnlyCollection<ChildObject>(children); }
}

次にoriginalChildrenupdateChildrenは両方とも同じ内容を持っているでしょう - 返さReadOnlyCollectionは、最初の行で、子どもたちのコレクションののスナップショットのではないでしょう。それはちょうどコレクションを中心に、のラッパーのだろう。彼らはちょうどそれ自体を変更することはできません。

- クライアントは変更しないで、それに頼ることはできないでしょう。
scroll top