投射从数据缓存检索到的列表时出现问题

问题描述 投票:0回答:4
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 ,它们是相同的类型。我还需要采取其他步骤才能让演员工作吗?

c# caching casting list
4个回答
3
投票

原因是缓存中的对象是使用不同版本的代码创建的,或者是从不同的 dll 副本加载的相同版本的代码。

为了防止错误停止代码,请使用 as 操作符来转换对象。如果转换失败,它仍然会从缓存加载数据:

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

if (listings == null) {
    listings = GetFPListings(Industry);
    Cache["Listings"] = listings;
}

0
投票

我相信原因是因为编译器无法推断出您显式转换为的类型,即使编译器知道原始 var 语句中要推断的类型。

请改用“as”键。

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

这也是更安全的强制转换方式,因为如果无法强制转换,它将返回 NULL(或 default(T)),而不是抛出异常。


0
投票

我怀疑 GetFPListings() 返回 List 的不同派生,可能是 IList。 编译器会将 var 解释为 IList,它会以这种方式进行缓存,但不能直接转换为 List。

但是,这与您的例外情况不符。 因此,如果您逐字复制异常,那么我就不知道了。


0
投票

你确定那条线在犹豫吗?它可能正在尝试在条件的 if 部分中转换该赋值语句。

如果您正在谈论

HttpContext.Cache
,那么您需要添加
Cache.Add()
或插入
Cache.Insert()
该项,而不是按索引存储它。

调用

Cache["Listings"] = listings
正在尝试使用键“listings”检索对象。

您也不必将其声明为新的。试试这个...

List<FPListing>() listings;
© www.soinside.com 2019 - 2024. All rights reserved.