如何限制一个项目添加到名单<T>?
-
20-09-2019 - |
题
我有课 Person
含有以性、父亲和列表中的儿童。
我希望每个人都只用 AddChild
方法,以增加儿童,不 List.Add
方法,
所以我如何限制使用它吗?
public class Person
{
private List<Person> _children = new List<Person>();
public string Name { get; set; }
public Person Father { get; set; }
public List<Person> Children
{
get
{
return _children;
}
}
public void AddChild(string name)
{
_children.Add( new Person { Name = name, Father = this });
}
}
解决方案
您的孩子属性更改为这样的:
public IList<Person> Children
{
get
{
return _children.AsReadOnly();
}
}
其他提示
使儿童为ReadOnlyCollection:
public IList<Person> Children
{
get
{
return new ReadOnlyCollection<Person>(_children);
}
}
暴露Children
作为IEnumerable<T>
如果你正在暴露下面List<T>
,然后在短:你不能
您可以编写自己的收集,包装类,或者是从Collection<T>
继承(仍然暴露出Add
,但你可以override
一些事情来检测检查数据在加入之前)。
揭露儿童属性作为ReadOnlyCollection<Person>
public ReadOnlyCollection<Person> Children
{
get {return _children.AsReadOnly();}
}
如果您使用。净额4.5或更大,你可以返回 _children
作为 IReadOnlyList<T>
:
public IReadOnlyList<Person> Children
{
get
{
return _children;
}
}
这是如何的不同返回 IList<Person>
通过 _children.AsReadOnly()
? IReadOnlyList<Person>
甚至没有突变的方法。考虑下列代码:
somePerson.Children[0] = null;
当使用 IReadOnlyList<Person>
这个代码将无法编译。当使用 .AsReadOnly()
这个代码将导致运行异常。
这是如何的不同返回 ReadOnlyCollection<Person>
通过 _children.AsReadOnly()
?有没有 ReadOnlyCollection<Person>
包装目的创建。除此之外,我看不到一个巨大的差异。
一个IEnumerable工作得很好:
public IEnumerable<Person> Children
{
get
{
return _children.AsReadOnly();
}
}
或更长嗦:
public IEnumerable<Person> Children
{
get
{
foreach (Person child in _children)
{
yield return child;
}
}
}
不隶属于 StackOverflow