无法将检索到的列表从缓存转换为所需的格式

时间:2013-06-07 15:20:34

标签: c# list c#-4.0 caching

我正在尝试将克隆对象列表添加到缓存中,这样当我修改原始源时,它不会更改缓存中的对象。但是,我无法将它们作为所需类型添加到缓存中。

List<ComputerStatus> clonedCopy = listOfComputers.Select(s => s.Clone()).ToList();向我提出错误"Cannot implicitly convert type 'System.Collections.Generic.List<object>' to 'System.Collections.Generic.List<MvcWebAPI.Models.ComputerStatus>'"

如果我只是将其作为

添加到缓存中
var clonedCopy = listOfComputers.Select(s => s.Clone());
CacheManager.AddToCache("myKey", clonedCopy, CacheItemPriority.Default, 30);

然后尝试将其检索为

List<ComputerStatus> listOfComputers = new List<ComputerStatus>();
listOfComputers = CacheManager.GetFromCache("myKey") as List<ComputerStatus>; 

然后它返回null

这就是我的ComputerStatus类的样子:

public class ComputerStatus : ICloneable
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
    public string Property3 { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

1 个答案:

答案 0 :(得分:1)

你试过吗

List<ComputerStatus> clonedCopy = listOfComputers.Select(s => (ComputerStatus)s.Clone()).ToList();

您的问题是因为来自Clone的{​​{1}}的默认实现返回了IClonable类型的对象,因此您选择的类型为object,其中ToList变为{ {1}}。通过将克隆结果转换为IEnumerable<object>,您可以将选择更改为List<object>,因此ComputerStatus会将其转换为IEnumerable<ComputerStatus>

您的第二次尝试失败是因为您存储的ToList()不能投放到List<ComputerStatus>,因此使用安全投射获得IEnumerable<object>。此外,您需要在没有List<ComputerStatus>的情况下小心存储,因为可枚举将推迟到您实际读取它,因此对集合的更改将影响它,或者可能引发集合修改的异常。