【发布时间】:2011-11-03 05:34:15
【问题描述】:
我有一些类层次结构 - 名为“Group”的基类,其中包含有关单个组的基本信息,以及名为“RootGroup”的类,它继承自“Group”并扩展具有一些属性的基类。组列表使用基类存储在缓存中:例如IEnumerable(有些是普通组,有些是根组。关键是在从缓存中检索集合并转换回IEnumerable类型时,丢失了RootGrop项的特定信息。有什么办法可以防止这种情况除了记住每个缓存项的类型吗?
吉米
【问题讨论】:
我有一些类层次结构 - 名为“Group”的基类,其中包含有关单个组的基本信息,以及名为“RootGroup”的类,它继承自“Group”并扩展具有一些属性的基类。组列表使用基类存储在缓存中:例如IEnumerable(有些是普通组,有些是根组。关键是在从缓存中检索集合并转换回IEnumerable类型时,丢失了RootGrop项的特定信息。有什么办法可以防止这种情况除了记住每个缓存项的类型吗?
吉米
【问题讨论】:
您可以在检索每个项目时检查它,并将其转换为正确的类型:
foreach (object item in list) {
if (item is RootGroup) {
Rootgroup rootGroup = item as RootGroup;
// do stuff with rootGroup
}
}
如果您使用的是通用集合,例如 List<Group>,您可以像这样更改 foreach:
foreach (Group item in list)...
【讨论】:
as 使用第二个条件来检查 item is RootGroup。考虑直接转换而不是 as,除非您期望显式运算符和继承。
as 更好看。如果您担心这样的简单检查,您可能使用了错误的语言。
如果我正确理解您的问题,您的RootGroup 属性不会“丢失”。问题是你有一个Group 对象的Group 视图。为了访问RootGroup 属性,您必须将对象转换为RootGroup。
一个简单的检查:
if(groupItem is RootGroup)
{
RootGroup rootGroupItem = groupItem as RootGroup;
// Do stuff
}
【讨论】:
另一种方式...
//from cache
IEnumerable<Group> groupsFromCache = GetGroupsFromCache();
IEnumerable<RootGroup> rootGroups = groupsFromCache.OfType<RootGroup>();
见http://www.thinqlinq.com/default/Using-Cast-Or-OfType-Methods.aspx
这有与延迟执行相关的各种细节,但如果没有更多细节,我无法真正判断这是否会有所作为。和其他帖子一样,您与子类相关的信息不会丢失,您只需将其放入可访问的表单中。
【讨论】: