0

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

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();
    }
}
4

1 回答 1

1

你有没有尝试过

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

您的问题是因为Clonefrom的默认实现IClonable返回一个类型的对象,object因此您选择的类型是IEnumerable<object>ToList 变成的类型List<object>。通过将 clone 的结果转换为 a ComputerStatus,您可以将 select 更改为,IEnumerable<ComputerStatus>然后ToList()将其转换为List<ComputerStatus>.

您的第二次尝试失败了,因为您正在存储一个IEnumerable<object>不可转换的对象,List<ComputerStatus>因此可以null使用安全转换。此外,您需要小心存储,ToList()因为可枚举将延迟到您实际阅读它,因此对集合的更改会影响它,或者可能会引发集合修改异常。

于 2013-06-07T15:24:26.993 回答