- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先让我解释一下为什么我要使用 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;
编译失败。他们都继承自同一个类,我认为他们会“兼容”。如何将集合转换(或公开)为我刚刚创建的只读类型?
最佳答案
我也不知道有任何内置解决方案。这是我在评论中给出的建议示例:
public class LockedDictionary : Dictionary<string, string>
{
public override void Add(string key, string value)
{
//do nothing or log it somewhere
//or simply change it to private
}
//and so on to Add* and Remove*
public override string this[string i]
{
get
{
return base[i];
}
private set
{
//...
}
}
}
您将能够遍历 KeyValuePair 列表和其他所有内容,但它不可用于写入操作。请确保根据您的需要键入它。
编辑为了有一个排序列表,我们可以将基类从 Dictionary<T,T>
更改为到 Hashtable
.
看起来像这样:
public class LockedKeyCollection : System.Collections.Hashtable
{
public override void Add(object key, object value)
{
//do nothing or throw exception?
}
//and so on to Add* and Remove*
public override object this[object i]
{
get
{
return base[i];
}
set
{
//do nothing or throw exception?
}
}
}
用法:
LockedKeyCollection aLockedList = new LockedKeyCollection();
foreach (System.Collections.DictionaryEntry entry in aLockedList)
{
//entry.Key
//entry.Value
}
不幸的是,我们无法更改方法的访问修饰符,但我们可以重写它们什么也不做。
关于c# - 如何让 KeyedCollection 成为只读的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11908527/
System.Collections.ObjectModel.KeyedCollection 类是 System.Collections.Generic.Dictionary 的一个非常有用的替代品,
我是 C# 的新手,如果这是一个愚蠢的问题,请原谅我。我遇到错误,但我不知道如何解决。我正在使用 Visual Studio 2010。 这行代码 public class GClass1 : Key
我想创建一个方法来遍历键控集合。我想确保我的方法支持迭代任何扩展 KeyedCollection> 的集合 方法如下: public void IterateCollection(KeyedColle
虽然我环顾四周,但没有找到任何与我的问题完全匹配的东西 this肯定是接近的。基本上,我有一个 Page 对象的 KeyedCollection 作为基础,我希望派生对象的强类型集合来自它。具体来说,
我有一个类 (SomeClass),它包含 string 类型的属性 Name。我需要存储该类的数组并按名称查找其项。为此,有两种类型的集合:KeyedCollection 和Dictionary。我
我正在开发一个 C# 对象复制构造函数,其中一部分涉及将 KeyedCollection 的内容复制到新的 KeyedCollection 中。这是我目前实现的: class MyKeyedColle
首先让我解释一下为什么我要使用 KeyedCollection。我正在构建一个 DLL,我有一个项目列表,我需要将它们添加到一个集合中,并让它们保持我放置它们的顺序,但我还需要通过它们的索引和键来访问
我正在寻找一种与通用字典的 Keys 属性(KeyCollection 类型)一样高效的方法。 使用 Linq select 语句可以,但每次请求键时它都会遍历整个集合,而我相信键可能已经存储在内部。
我有这段代码(我希望它能工作,但它失败了)。我真的不知道为什么。请帮忙 static void Main(string[] args) { var x = new M
我想使用 KeyedCollection 来存储一个针对字符串键值的类。我有以下代码: public class MyClass { public string Key; public
我认为这是我们遇到的一个常见问题。 class Person { public string place; public string name; public Person(
我是 WPF 数据绑定(bind)的初学者,我刚刚发现了一种令人困惑的行为。也许有人可以帮助我: 我的 xaml 代码将列表框绑定(bind)到列表: 如果绑定(bind)的实际项目是一个列表,一切
基本上我有一个 KeyedCollection ,并且我希望能够按键(或者最好使用自定义比较器)对集合进行排序。 如果这不可能,有人可以推荐另一个类,其中键嵌入在我可以排序的值中吗? 最佳答案 根据更
我经常需要一组带有数字标识符的非顺序对象。我喜欢为此使用 KeyedCollection,但我认为有一个严重的缺点。如果您使用 int 作为键,您将无法再通过索引访问集合的成员(collection[
我有课 public class FooKeyedCollection : KeyedCollection { } public enum FooType { FooType1, FooT
是否存在与 C# 抽象 KeyedCollection 类具有相同行为的 Java 集合(即可以通过键和索引检索项目)?我环顾四周,但找不到类似的东西。 谢谢,尼克 最佳答案 这是使用“KeyedIt
请参阅下面的 VS2013 更新。 将类用作 d:DesignInstance 时暴露了 KeyedCollection ,XAML 设计器发出以下警告: The number of generic
我是一名优秀的程序员,十分优秀!