簡體   English   中英

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

[英]Is there a .NET collection interface that prevents adding objects?

我有一個維護另一個類的對象列表的類。 對象列表是公共屬性。 我想阻止用戶直接添加和刪除對象列表,如下所示:

      MyObject.MyListProperty.Add(object);

相反,我希望他們使用內部執行某些處理的方法,然后將對象添加到列表中。

我有一些想法:

  • 創建List<T>后代並覆蓋添加和刪除
  • 通過屬性getter返回列表的新副本(列表相對較短,不超過30個對象)

是否有一些沒有添加和刪除的集合界面?

編輯:
我將使用ReadOnlyCollection<T> 原因是可以更新包裝集合,並且只讀對象中的更改將立即可見(請參閱ReadOnlyCollection<T>AsReadOnly() MSDN代碼示例)。 這允許只讀一次創建只讀列表。

IEnumerable的問題是對象可以被轉換回原始List<T>然后直接操作。

您可以使用ReadOnlyCollection - 將您的集合包裝在其中並將ReadOnlyCollection返回給您的類的用戶:

return new ReadOnlyCollection(innerCollection);

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

return innerCollection.AsReadOnly();

IEnumerable接口將執行您所需的操作,因為它只有一個成員GetEnumerator() ,它只允許您遍歷項目。

也許AsReadOnly方法可以解決這個問題,將只讀實例交給public。

否則, IEnumerable<T>沒有AddRemove ,所以你可以這樣做:

private List<int> _myList;
public IEnumerable<int> MyList
{
   get
   {
      return this._myList.ToList();
   }
}

我寧願選擇IEnumerable<T> (+ copy)和ReadOnlyCollection<T> ,因為:更改到基本列表(從中創建只讀集合)將立即顯示在您的讀取實例中只收藏。 這可能導致鎖定和straaange問​​題:)

您最簡單的選擇是通過公共屬性將您的列表公開為以下IEnumerableICollection ReadOnlyCollection之一

因此,您可以創建自己的列表type ,將您的Items公開為上述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);
    }
}

開箱即用,只有IEnumerable<T>才會提供此功能,而不會暴露任何可能欺騙客戶端獲取運行時異常的AddRemove公共方法。

如果您希望公共API明確聲明該集合是只讀的並且您需要索引器,則必須圍繞現有的List<T>T[]編寫自己的包裝器。

你可以給它們一個總是返回一個可以用來訪問結構的枚舉器的對象嗎?

沒有真正回答你的問題,但如果你決定實現你的兩個想法之一,那么它們是有用的信息:你可以使用ToArray創建一個副本並返回一個數組。

或者您可以這樣做: http//en.csharp-online.net/CSharp_Generics_Recipes%E2%80%94Making_Read-Only_Collections_the_Generic_Way

ICollection(非泛型版本)只獲得IEnumerable + Count

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM