【发布时间】:2012-03-07 23:33:01
【问题描述】:
我通常会尝试遵循一种方法,即让方法的参数尽可能通用,并根据需要返回通用类型,但我遇到了一个我不太清楚答案的问题。
我有一个控件,它在如下结构上运行:
IDictionary<string, IDictionary<string, IEnumerable<MyObject>>>
所以提供两个键,我们得到一个对象的集合。非常直接。
我有课
ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
就是这样,一个只读字典,因此任何会改变字典的 IDictionary 方法都会抛出 NotSupportedException();
控件操作的字典来自 MyObjectRepository,它返回一个
ReadOnlyDictionary<string, ReadOnlyDictionary<string, ReadOnlyCollection<MyObject>>>
所以问题是,我是否应该将存储库上的返回类型更新为返回
IDictionary<string, IDictionary<string, IEnumerable<MyObject>>>
还是……?我认为更新方法以获取只读字典是不正确的,因为这是不必要的限制。
这似乎使返回类型不太清楚。此外,该接口将 ReadOnlyDictionary 定义为返回类型,因此实现类不能返回允许修改的字典。感觉就像接口返回一个应该只读的集合,那么返回类型应该反映这一点。通过指定泛型 IDictionary<...> 返回类型,使用该接口的方法可能会尝试修改字典以仅遇到 NotSupportedException。
感谢任何有关如何解决此问题的建议!
更新 事实证明,这里真正的问题在于 ReadOnlyCollection。它应该被 IEnumerable 取代,它简化了在各种返回类型之间转换的大部分工作。
请参阅 ReadOnlyCollection or IEnumerable for exposing member collections? 并注意 Jon Skeet 的回答。这就是我喜欢 SO 的原因 :)
【问题讨论】:
标签: generics collections interface dictionary return-type