Наследование и кеширование в ASP.NET - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть некоторая иерархия классов - базовый класс с именем «Group», который содержит базовую информацию об отдельной группе, и класс с именем «RootGroup», который наследуется от «Group» и расширяет базовый класс некоторыми свойствами. Список групп хранится в кеше с использованием базового класса: например, IEnumerable (некоторые из них являются обычными группами, а некоторые являются корневыми группами. Дело в том, что когда коллекция извлекается из кэша и возвращается к типу IEnumerable, конкретная информация об элементах RootGrop теряется. Есть ли способ предотвратить эта ситуация, кроме запоминания типа каждого кэшированного элемента?

Jimmy

Ответы [ 3 ]

0 голосов
/ 02 ноября 2011

Вы можете проверять каждый предмет по мере его извлечения и приводить его к правильному типу:

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)...
0 голосов
/ 03 ноября 2011

Другой способ ...

//from cache
IEnumerable<Group> groupsFromCache = GetGroupsFromCache();
IEnumerable<RootGroup> rootGroups = groupsFromCache.OfType<RootGroup>();

См. http://www.thinqlinq.com/default/Using-Cast-Or-OfType-Methods.aspx

У этого есть различные тонкости, связанные с отложенным выполнением, но без более подробной информации я не могу точно сказать, имеет ли это значение. И, как отмечалось в других сообщениях, ваша информация, связанная с дочерним классом, не теряется, вам просто нужно поместить ее в форму, где она будет доступна.

0 голосов
/ 02 ноября 2011

Если я правильно понимаю ваш вопрос, ваши свойства RootGroup не будут "потеряны".Проблема в том, что у вас есть Group вид RootGroup объекта.Чтобы получить доступ к RootGroup свойствам, вы должны привести объект к RootGroup.

Простая проверка:

 if(groupItem is RootGroup)
 {
       RootGroup rootGroupItem = groupItem as RootGroup;
       // Do stuff
 } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...