在查看.net通用集合时,我发现了KeyedByTypeCollection。虽然我已经使用它并知道如何使用它,但我不知道它在哪种情况下会有用。
我阅读了ServiceProvider、缓存等用泛型完成而不需要转换,但没有得到很多信息。
我认为,它被包含在.NET框架中一定有其原因。任何已经使用过KeyedByTypeCollection的人都可以解释一下他们为什么使用它,或者如果他们知道潜在的使用场景,也可以向我解释。
只是出于好奇,其他语言是否支持这种类型的集合?
在查看.net通用集合时,我发现了KeyedByTypeCollection。虽然我已经使用它并知道如何使用它,但我不知道它在哪种情况下会有用。
我阅读了ServiceProvider、缓存等用泛型完成而不需要转换,但没有得到很多信息。
我认为,它被包含在.NET框架中一定有其原因。任何已经使用过KeyedByTypeCollection的人都可以解释一下他们为什么使用它,或者如果他们知道潜在的使用场景,也可以向我解释。
只是出于好奇,其他语言是否支持这种类型的集合?
VALUE
的KEYedCollection<KEY,VALUE>
。例如,如果您想实现返回单例的工厂,则使用这个集合非常方便:public class Factory<T>
{
private readonly KeyedByTypeCollection<T> _singletons = new KeyedByTypeCollection<T>();
public V GetSingleton<V>() where V : T, new()
{
if (!_singletons.Contains(typeof(V)))
{
_singletons.Add(new V());
}
return (V)_singletons[typeof(V)];
}
}
[Test]
public void Returns_Singletons()
{
Factory<ICar> factory = new Factory<ICar>();
Opel opel1 = factory.GetSingleton<Opel>();
Opel opel2 = factory.GetSingleton<Opel>();
Assert.IsNotNull(opel1);
Assert.IsNotNull(opel2);
Assert.AreEqual(opel1, opel2);
}
KeyedByTypeCollection<T>
的另一个用途是在服务定位器中使用...KeyedCollection
并编写GetKeyForItem
方法返回Item参数的类型。
KeyedByTypeCollection
定义了四个方法是无关紧要的(Find
, FindAll
, Remove
, 和RemoveAll
)。Find, FindAll和RemoveAll没有基本KeyedCollection
实现。Remove在基类中存在。
KeyedByTypeCollection
中所有这四种方法的第一个问题是它们对基本集合执行串行搜索以查找项目。为什么不只是使用索引器从KeyedCollection
检索适当的项目呢?FindAll
和RemoveAll
仅会查找1个项目(如果集合中存在一个项目)-因为根据定义,只有指定类型的1个项目将存在于集合中(哦,并且FindAll
将在序列中读取所有元素,即使它在开头找到匹配的元素)。 因此,FindAll
和RemoveAll
将在查找/删除0或1个项目之前读取集合中的所有项目。 再次强调,为什么不使用索引器或Remove的基本版本执行所需的过程?GetKeyForItem
方法的地方没有调用,因此,如果覆盖GetKeyForItem
方法,则还必须覆盖其他几个方法才能正确获取集合的键。