当您有一个包含项目列表的对象时,如何管理这个简单的场景.例如:
public class ContainerObject { IListChildren { get; } public void AddCustom(ChildObject toAdd) { // Some validation ... Children.Add(toAdd); } }
假设集合初始化为IList的实现,是否有任何方法可以控制项目添加到列表的方式?
例如,我在ContainerObject类上有另一个方法,它接受一个ChildObject并将其添加到列表中.在添加之前,需要此方法对ChildObject执行一些基本验证.
我很懒,因为我不想乱搞并编写一个消费开发人员需要实现的自定义列表界面(没有添加方法).我也在IQueryable接口上使用ToList()方法,所以这是坚持IList的另一个原因 - 它只是起作用.
那么,有没有一种方法可以监控项目如何添加到IList实例,即阻止使用Add方法,只允许通过我的自定义方法添加到集合中,或者我只是要求不可能的?......而且很懒:(
我可以想到一些hacky方法来检查何时通过我的自定义方法或直接在列表中添加项目但这些看起来很糟糕!
有人遇到类似的东西吗?如果是这样,你做了什么?
您可以使用属性使您的属性返回原始列表的包装器ReadOnlyCollection
.这将确保呼叫者不会自己添加任何项目.您可以保留对原始可变列表的引用.请注意,因为只读集合只是一个包装器,所以缓存只读集合的调用者仍会看到您对原始列表所做的添加.取决于您的预期用途,这可能是也可能不是好事.
编辑:解释我的缓存评论......
假设客户做了:
IListoriginalChildren = container.Children; container.AddChild(new ChildObject()); IList updatedChildren = container.Children;
使用如下所示的Children
属性:
private IListchildren = new List (); public IList Children { get { return new ReadOnlyCollection (children); } }
然后originalChildren
,updateChildren
两者都具有相同的内容 - 返回的内容ReadOnlyCollection
不会是第一行中子集合的快照.它只是该集合的包装.客户无法依赖它而不会改变 - 他们只是无法自己改变它.