是否有一个.NET集合接口阻止添加对象?

zen*_*dar 24 .net c# collections list

我有一个维护另一个类的对象列表的类.对象列表是公共属性.我想阻止用户直接添加和删除对象列表,如下所示:

      MyObject.MyListProperty.Add(object);
Run Code Online (Sandbox Code Playgroud)

相反,我希望他们使用将在内部进行一些处理然后将对象添加到列表的方法.

我有一些想法:

  • 创建后代List<T>并覆盖添加和删除
  • 通过属性getter返回列表的新副本(列表相对较短,不超过30个对象)

是否有一些没有添加和删除的集合界面?

编辑:
我要去ReadOnlyCollection<T>.原因是包裹集可更新和变化将是只读对象立即可见(参见MSDN代码示例ReadOnlyCollection<T>AsReadOnly()).这允许只读一次创建只读列表.

问题IEnumerable是对象可以被转换回原始对象List<T>然后直接操作.

Ode*_*ded 36

您可以使用ReadOnlyCollection - 将您的集合包装在其中并返回ReadOnlyCollection给您的类的用户:

return new ReadOnlyCollection(innerCollection);
Run Code Online (Sandbox Code Playgroud)

或者使用类的AsReadOnly方法List<T>:

return innerCollection.AsReadOnly();
Run Code Online (Sandbox Code Playgroud)

IEnumerable的接口将你所需要的,因为它只有一个成员GetEnumerator(),那样只会让你遍历项目.

  • AsReadOnly(http://msdn.microsoft.com/en-us/library/e78dcd75.aspx)不是Linq (2认同)

And*_*air 5

也许AsReadOnly方法可以解决这个问题,将只读实例交给public.

否则,IEnumerable<T>没有Add也没有Remove,所以你可以这样做:

private List<int> _myList;
public IEnumerable<int> MyList
{
   get
   {
      return this._myList.ToList();
   }
}
Run Code Online (Sandbox Code Playgroud)

我宁愿选择IEnumerable<T>(+副本)ReadOnlyCollection<T>,因为:对基本列表(从中创建只读集合)的更改将立即显示在您的只读集合的​​实例中.这可能导致锁定和straaange问​​题:)


Jam*_*mes 5

您最简单的选择是通过公共属性将您的列表公开为以下IEnumerable,ICollection ReadOnlyCollection之一.

因此,您可以创建自己type的列表,将您Items的上述内容公开,但有一个内部添加方法,例如

public class MyList<MyType>
{
    private List<MyType> items;

    public MyList()
    {
        items = new List<MyType>();
    }

    public IEnumerable Items { get { return items.AsEnumerable(); } }
    public Add(MyType item)
    {
        // do internal processing
        items.Add(item);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会阻止将集合强制转换回List <MyType>并在其上调用Add.如果你真的需要阻止添加,ReadOnlyCollection是你要走的路.此外,没有必要调用items.AsEnumerable我不认为这将编写为编写因为AsEnumerable()将返回IEnumerable <MyType>并且Items被键入为IEnumerable. (3认同)