コンビニや「怠惰なプログラミング」のIList管理 - 保護IList.Add方法
-
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 に戻ります追加を管理します。
他のヒント
編集:私のキャッシングのコメントを説明するために...
クライアントがしたと仮定します:
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); }
}
次にoriginalChildren
とupdateChildren
は両方とも同じ内容を持っているでしょう - 返さReadOnlyCollection
は、最初の行で、子どもたちのコレクションののスナップショットのではないでしょう。それはちょうどコレクションを中心に、のラッパーのだろう。彼らはちょうどそれ自体を変更することはできません。