将列表项设为只读

本文关键字:只读 列表 | 更新日期: 2023-09-27 18:06:50

可能重复:
列表<T>专用只读

我有一个类:

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

如果我将列表日志设为私有,那么我将实现这一点,但我希望用户能够看到日志列表的内容,但不能编辑项目。

此外,我不想将公共枚举状态设为私有,这样用户就可以看到状态。。。

那么,我如何限制用户编辑列表中的项目呢?

将列表项设为只读

为此使用ReadOnlyCollection。另外,请记住,readonly关键字并不能真正使集合成为只读的。

private List<Status> m_Log = new List<Status>();
public ReadOnlyCollection<Status> Log {
    get {
        return m_Log.AsReadOnly();
    }
}

返回List.AsReadOnly((。

不要将您的财产设为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; }
}

将日志列表设为私有并具有公共get((属性怎么样?

您可以选择让SomeClass继承IEnumerable<T>

这将导致您履行约定并实现GetEnumerator方法。只需返回列表的枚举器。现在可以将其用作只读IEnumerable集合。

编辑
我又看了一遍,意识到你只需要添加一个属性获取器:

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