将列表项设为只读
本文关键字:只读 列表 | 更新日期: 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;
}
}