我有一些类层次结构 - 名为“Group”的基类,它包含有关单个组的基本信息,以及从“Group”继承的名为“RootGroup”的类并扩展了基础有一些属性的类。组列表使用基类存储在缓存中:例如IEnumerable(其中一些是普通组,其中一些是根组,其中一些是根组),问题是何时从缓存中检索集合并将其转换回IEnumerable类型,RootGrop项目的特定信息会丢失。这种情况下,除了记住每一个缓存项的类型?ASP.NET中的继承和缓存
吉米
我有一些类层次结构 - 名为“Group”的基类,它包含有关单个组的基本信息,以及从“Group”继承的名为“RootGroup”的类并扩展了基础有一些属性的类。组列表使用基类存储在缓存中:例如IEnumerable(其中一些是普通组,其中一些是根组,其中一些是根组),问题是何时从缓存中检索集合并将其转换回IEnumerable类型,RootGrop项目的特定信息会丢失。这种情况下,除了记住每一个缓存项的类型?ASP.NET中的继承和缓存
吉米
如果我明白你的问题正确,你的RootGroup
性质不被“丢失”。问题是你有一个Group
视图RootGroup
对象。要访问RootGroup
属性,必须将该对象投射到RootGroup
。
一个简单的检查:
if(groupItem is RootGroup)
{
RootGroup rootGroupItem = groupItem as RootGroup;
// Do stuff
}
为您检索它您可以检查每个项目,并把它转换为适当类型:
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)...
另一种方式......
//from cache
IEnumerable<Group> groupsFromCache = GetGroupsFromCache();
IEnumerable<RootGroup> rootGroups = groupsFromCache.OfType<RootGroup>();
见http://www.thinqlinq.com/default/Using-Cast-Or-OfType-Methods.aspx
与延迟执行相关联。这有各种各样的礼节,但没有更详细的我真的不能告诉,如果有差别。和其他帖子一样,您的与孩子课程相关的信息不会丢失,您只需将其放入可访问的表单即可。
'as'使用第二个条件来检查'item是否是RootGroup'。考虑直接转换而不是'as',除非你期望显式的运算符和继承。 –
imo,'as'更好看。如果你担心这样简单的检查,你可能使用了错误的语言。 –