在我的C#项目中,我有一个包含列表的类

public class MyClass
{
  public MyClass parent;
  public List<MyClass> children;
  ...
}

我想防止该类的用户向子列表添加(和删除)元素,但他仍将能够解析其元素。我想处理MyClass中的添加和删除,提供一个AddChild(MyClass项目)和DeleteChild(MyClass项目),以确保在将一个项目添加到子级列表时,该项目的父级将被正确设置。

除了实现自己的IList之外,还有其他想法吗?

提前致谢,
坦率

最佳答案

如果将调用者的List<T>交给,则无法控制。您甚至无法继承List<T>,因为添加/删除不是virtual

相反,我将数据公开为IEnumerable<MyClass>:

private readonly List<MyClass> children = new List<MyClass>();
public void AddChild(MyClass child) {...}
public void RemoveChild(MyClass child) {...}
public IEnumerable<MyClass> Children {
    get {
        foreach(var child in children) yield return child;
    }
}

(yield return阻止他们进行转换)

调用方仍然可以在foreach上使用.Children,而且由于有了LINQ,他们也可以做所有其他有趣的事情(WhereFirst等)。

10-06 13:58
查看更多