当你有一个项目列表的对象如何管理这个简单的场景。 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); }
}

然后originalChildrenupdateChildren将都具有相同的内容 - 返回ReadOnlyCollection不会是一个的快照的孩子集合在第一线。这将只是一个的包装的周围的集合。客户端将无法依靠它不改变 - 他们只是将无法改变它自己

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top