首先让我解释一下为什么我使用 KeyedCollection。我正在构建一个 DLL,并且我有一个需要添加到集合中的项目列表,并让它们保持我放置它们的顺序,但我还需要通过它们的索引和键来访问它们(键是我已经定义的对象的属性)。如果有其他更简单的集合可以做到这一点,请告诉我。
好的,现在我需要能够在 DLL 内部向此集合添加项目,但我需要它以只读方式对 DLL 的最终用户公开可用,因为我不希望他们删除/更改我添加的项目.
我已经搜索了这个网站,其他网站,一般的谷歌,我还没有找到一种方法来获得某种只读的 KeyedCollection。我最接近的是这个页面(http://www.koders.com/csharp/fid27249B31BFB645825BD9E0AFEA6A2CCDDAF5A382.aspx?s=keyedcollection#L28)但我不能让它工作。
更新:
我看了看那些C5课程。那,连同你的其他评论,帮助我更好地理解如何创建我自己的只读类,它似乎工作。但是,当我尝试将常规的转换为只读的时,我遇到了问题。我得到一个编译时无法转换错误。这是我创建的代码(第一个小类是我最初拥有的):
public class FieldCollection : KeyedCollection<string, Field>
{
protected override string GetKeyForItem(Field field)
{
return field.Name;
}
}
public class ReadOnlyFieldCollection : KeyedCollection<string, Field>
{
protected override string GetKeyForItem(Field field)
{ return field.Name; }
new public void Add(Field field)
{ throw new ReadOnlyCollectionException("This collection is read-only."); }
new public void Clear()
{ throw new ReadOnlyCollectionException("This collection is read-only."); }
new public void Insert(int index, Field field)
{ throw new ReadOnlyCollectionException("This collection is read-only."); }
new public bool Remove(string key)
{ throw new ReadOnlyCollectionException("This collection is read-only."); }
new public bool Remove(Field field)
{ throw new ReadOnlyCollectionException("This collection is read-only."); }
new public bool RemoveAt(int index)
{ throw new ReadOnlyCollectionException("This collection is read-only."); }
}
如果我定义了这个变量:
private FieldCollection _fields;
然后这样做:
public ReadOnlyFieldCollection Fields;
Fields = (ReadOnlyFieldCollection)_fields;
它无法编译。它们都继承自同一个类,我认为它们会“兼容”。如何将集合转换(或公开)为我刚刚创建的只读类型?