我正在尝试将克隆对象列表添加到缓存中,这样当我修改原始源时,它不会更改缓存中的对象。但是,我无法将它们作为所需类型添加到缓存中。
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();
}
}
答案 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>
的情况下小心存储,因为可枚举将推迟到您实际读取它,因此对集合的更改将影响它,或者可能引发集合修改的异常。