Проблема приведения списка, извлеченного из кэша данных - PullRequest
1 голос
/ 19 февраля 2009
var listings = new List<FPListing>();

if (Cache["Listings"] == null)
{
    listings = GetFPListings(Industry);
    Cache["Listings"] = listings;
}
else
{
    listings = (List<FPListing>)Cache["Listings"];
}

В ролях это исключение

Невозможно привести объект типа 'System.Collections.Generic.List 1[Listings+FPListing]' to type 'System.Collections.Generic.List 1 [Тэг + FPListing].

Которые согласно GetType являются идентичными типами. Есть ли еще один шаг, который мне нужно сделать, чтобы заставить актеров работать?

Ответы [ 4 ]

3 голосов
/ 21 февраля 2009

Причина в том, что объект в кеше был создан с использованием другой версии кода или той же версии кода, загруженной из другой копии DLL.

Чтобы не допустить остановки кода из-за ошибки, используйте объект-указатель as для создания объекта. Если произойдет сбой приведения, он все равно загрузит данные из кеша:

List<FPListing> listings = Cache["Listings"] as List<FPListing>;

if (listings == null) {
    listings = GetFPListings(Industry);
    Cache["Listings"] = listings;
}
0 голосов
/ 25 февраля 2009

Я подозреваю, что GetFPListings () возвращает другую производную List, возможно, IList. Компилятор интерпретирует var как IList, который будет кэширован таким образом, который не может быть напрямую преобразован в List.

Однако это не соответствует вашему исключению. Так что если вы скопировали исключение дословно, тогда я понятия не имею.

0 голосов
/ 20 февраля 2009

Я полагаю, что причина в том, что компилятор не может вывести тип, к которому вы явно приводите данные, даже если компилятор знает, что тип выводится в исходном операторе var.

Вместо этого используйте «как».

listings = Cache["Listings"] as List<FPListing>();

Это также более безопасный способ приведения, поскольку он возвращает NULL (или значение по умолчанию (T)), если он не может быть приведен - вместо создания исключения.

0 голосов
/ 19 февраля 2009

Вы уверены, что это черта? Возможно, выполняется попытка приведения в этом операторе присваивания в условной части if.

Если вы говорите о HttpContext.Cache, то вам нужно добавить (Cache.Add ()) или вставить (Cache.Insert ()) элемент, а не хранить его по индексу.

При вызове «Cache [" Listings »] = lists» пытается получить объект с ключом «lists»

Вам также не нужно объявлять его новым. Попробуйте вместо этого ...

List<FPListing>() listings;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...