以只读方式读取HttpRuntime.Cache项

Lib*_* TK 7 .net c# asp.net caching httpruntime.cache

我使用a HttpRuntime.Cache来存储将在会话中频繁访问的对象列表.

我使用以下代码行从缓存中获取项目:

List<chartData_Type> _chartData = 
             (List<chartData_Type>)HttpRuntime.Cache.Get("rollingMonth");
Run Code Online (Sandbox Code Playgroud)

但是,不幸的是,当我更新_chartData时,它也会更新缓存的项目.

我怎样才能简单地获得缓存项目的副本?

cuo*_*gle 6

这是.NET的作品,因为缓存只是参考的方式指针List.不知道您chartData_Type是值类型还是引用类型.

如果是值类型,它很容易使用:

List<chartData_Type> list = new List<chartData_Type>(_chartData);
Run Code Online (Sandbox Code Playgroud)

但是如果引用类型变得复杂,则需要为您的类实现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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用此方法,chartData_Type必须标记类[Serializable]:

[Serializable]
class chartData_Type
{}
Run Code Online (Sandbox Code Playgroud)

因此,您可以手动进行深度克隆:

var cloneChartData = _chartData.Select(d => 
                                       CloneHelper.DeepClone<chartData_Type>(d))
                        .ToList();
Run Code Online (Sandbox Code Playgroud)