c# - 方便还是 "lazy programming"IList管理-保护IList.Add方法

标签 c# architecture

当您有一个包含项目列表的对象时,您如何管理这个简单的场景。例如:

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

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

假设集合初始化为 IList 的实现,是否有任何方法可以控制将项目添加到列表的方式?

例如,我在 ContainerObject 类上有另一个方法,它接受一个 ChildObject 并将其添加到列表中。此方法需要在添加 ChildObject 之前对其执行一些基本验证。

我很懒惰,因为我不想乱写一个自定义列表接口(interface)(没有 add 方法),消费开发人员需要实现。我还在 IQueryable 接口(interface)上使用了 ToList() 方法,所以这是坚持使用 IList 的另一个原因 - 它很管用。

那么,有没有一种方法可以监管如何将项目添加到 IList 实例,即阻止使用 Add 方法并只允许通过我的自定义方法添加到集合中,或者我只是在问不可能的事情? ...而且很懒惰:(

我能想到一些 hacky 方法来检查何时通过我的自定义方法或直接在列表中添加项目,但这些看起来很 hacky!

有人遇到过类似的事情吗?如果是,你做了什么?

最佳答案

您可以使用 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不会是第一行 child 集合的快照。它只是集合的包装器。客户不能指望它不改变 - 他们只是无法自己改变它。

关于c# - 方便还是 "lazy programming"IList管理-保护IList.Add方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/554159/

相关文章:

c# - WPF ICommand.Execute on UI, XP

c# - 如何查找文件是系统文件还是隐藏文件?

c++ - 为什么代码以线性方式比以循环方式运行得慢?

c# - 多层架构中的身份验证

c++ - 向客户公开服务

javascript - 如何构建 Javascript 架构以补充 PHP MVC 网络应用程序?

c# - 如何从大文本中提取匹配字符串?

c# - 为什么我会收到 411 Length required 错误?

c# - 如何使用C#查找第三方应用程序(如Google Earth)的安装目录?

android - 将 REST API 调用置于 Uncle Bob 的 Clean Architecture 中的何处?