我有名为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 });
}
}
答案 0 :(得分:12)
将子项公开为ReadOnlyCollection:
public IList<Person> Children
{
get
{
return new ReadOnlyCollection<Person>(_children);
}
}
答案 1 :(得分:8)
将Children
公开为IEnumerable<T>
答案 2 :(得分:8)
将您的儿童属性更改为:
public IList<Person> Children
{
get
{
return _children.AsReadOnly();
}
}
答案 3 :(得分:7)
如果你暴露了潜在的List<T>
,那么简而言之:你不能。
您可以编写自己的集合包装类,也可以继承Collection<T>
(仍然会公开Add
,但您可以override
一些事情来检查数据添加)。
答案 4 :(得分:3)
将Children属性公开为ReadOnlyCollection<Person>
public ReadOnlyCollection<Person> Children
{
get {return _children.AsReadOnly();}
}
答案 5 :(得分:3)
如果您使用的是.NET 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>
包装器对象。除此之外,我没有看到巨大的差异。
答案 6 :(得分:2)
IEnumerable工作得很好:
public IEnumerable<Person> Children
{
get
{
return _children.AsReadOnly();
}
}
或更长的啰嗦:
public IEnumerable<Person> Children
{
get
{
foreach (Person child in _children)
{
yield return child;
}
}
}