将列表项设为只读

时间:2011-08-26 16:51:54

标签: c# private readonly public

  

可能重复:
  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

如果我将列表日志设为私有,那么我将实现此目的,但我希望用户能够查看日志列表的内容,但无法编辑项目。

我也不想让公共枚举状态为私有,以便用户可以看到状态...

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

5 个答案:

答案 0 :(得分:4)

答案 1 :(得分:4)

使用ReadOnlyCollection。另外请注意,请记住readonly关键字并不能真正使集合只读。

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

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

答案 2 :(得分: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; }
}

答案 3 :(得分:1)

如何将日志列表设为私有并具有公共get()属性?

答案 4 :(得分:0)

您拥有的一个选项是SomeClass继承IEnumerable<T>

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

修改
我再次看到这个,并意识到你只需要添加一个属性getter:

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