2011-08-26 71 views
3

可能重複:
List<T> readonly with a private set使列表項只讀

我有一個類爲:

public SomeClass{ 

     public List<Status> log { get; private set; } 

     public enum Status 
     { 
      waitingForConnection, 
      connected, 
      receivingFile, 
      doneReceivingFile 
     } 

     // later I initialize log and populate it... 
     /// 

} 

到目前爲止,這是容易看出我只是能從班級設置新的日誌列表。如何防止用戶編輯列表中的項目。換句話說,我不希望用戶能夠做一些事情如:

SomeClass someClass = new SomeClass(); 
//.... 
someClass.log[3] = \\different value 

如果我榜上無名登錄私人那麼我會做到這一點,但我想,使用戶能夠查看日誌列表的內容但不能編輯項目。

也是我不想讓公衆枚舉狀態私有,這樣用戶可以看到的狀態...

所以我怎麼能限制從編輯列表中的項目的用戶?

+1

退房在這個線程的答案: http://stackoverflow.com/questions/4749021/listt-readonly-with-a-private-set –

回答

4

使用ReadOnlyCollection這一點。另請注意,只讀關鍵字並不能真正使集合成爲只讀。

private List<Status> m_Log = new List<Status>(); 

public ReadOnlyCollection<Status> Log { 
    get { 
     return m_Log.AsReadOnly(); 
    } 
} 
+0

我很喜歡這個,但它是NET4.5 +。 –

+0

'ReadOnlyCollection '從2.0開始就已經出現了。 –

+0

我的不好,不好意思:( –

3

不要讓你的財產List<Status>。只需實現一個沒有setter的索引器屬性。

class Log { 
    private readonly List<Status> statuses; 
    public Log(List<Status> items) 
    { 
    statuses = items; 
    } 
    public Status this[int i] 
    { 
     get { return statuses[i]; } 
    } 
} 

public SomeClass 
{ 
    public Log log { get; private set; } 
} 
+0

這並不妨礙消費者做這樣的事情'實例.Log [0] .SomeProperty = 10',是嗎? – nphx

1

如何使日誌列表爲私人並具有公共get()屬性?

0

您擁有的一種選擇是讓SomeClass繼承IEnumerable<T>

這將導致您履行合同並實施GetEnumerator方法。只需返回列表的枚舉器即可。現在可以將其用作只讀IEnumerable集合。

編輯
我再次看着這一點,並意識到你只需要做添加屬性的getter:

IEnumerable<Status> StatusList 
{ 
    foreach (Status item in log) 
    { 
     yield return item; 
    } 
}