我有一些類層次結構 - 名爲「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'更好看。如果你擔心這樣簡單的檢查,你可能使用了錯誤的語言。 –