我使用HttpRuntime.Cache来存储在会话之间频繁访问的对象列表。
我使用以下代码行从缓存中获取项目:

List<chartData_Type> _chartData =
             (List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth");

但是,不幸的是,当我更新图表数据时,它也会更新缓存项。
如何简单地获取缓存项的副本?

最佳答案

这就是.NET的工作方式,因为缓存只引用List的指针。不知道chartData_Type是值类型还是引用类型。
如果是值类型,则易于使用:

List<chartData_Type> list = new List<chartData_Type>(_chartData);

但如果引用类型变得复杂,则需要为类实现DeepCopy方法,然后对列表中的每个对象执行DeepCopy操作。
DeepClone方法:
public static class CloneHelper
{
    public static T DeepClone<T>(T obj)
    {
        using (var ms = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(ms, obj);
            ms.Position = 0;

            return (T) formatter.Deserialize(ms);
        }
    }
}

要使用此方法,必须将类标记为:
[Serializable]
class chartData_Type
{}

因此,您可以手动执行深度克隆:
var cloneChartData = _chartData.Select(d =>
                                       CloneHelper.DeepClone<chartData_Type>(d))
                        .ToList();

10-07 21:32