gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:50:42 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com