便利或“懒人编程”的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中的一种实现中,有任何方法,其中,以控制对象被添加到列表中的方法是什么?
例如,我对ContainerObject类,需要一个ChildObject并将其添加到列表中的另一种方法。需要该方法在添加它之前执行对ChildObject一些基本验证。
我是懒惰的,我不想浪费时间,写一个自定义列表界面(无add方法),食用开发商需要实现。我还使用IQueryable的接口上的ToList()方法,所以这是另一个原因与IList的粘 - 它只是工作
那么,有没有可以在其中警察如何项添加到IList中的实例,即防止在使用Add方法,并只允许通过我的自定义方法添加到集合,还是我只是缘木求鱼的做法? ...和懒惰:(
我能想到的一些哈克方式,以检查项目时,通过我的自定义方法或直接在列表上添加但这些似乎哈克!
任何人都遇到类似这样的东西?如果是这样,你做了什么?
解决方案
返回一个 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); }
}
然后originalChildren
和updateChildren
将都具有相同的内容 - 返回ReadOnlyCollection
不会是一个的快照的孩子集合在第一线。这将只是一个的包装的周围的集合。客户端将无法依靠它不改变 - 他们只是将无法改变它自己