我有课 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;
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top