2

该类如下所示:

public static class CacheManager
{
    private static Dictionary<string, object> cacheItems = new Dictionary<string, object>();

    private static ReaderWriterLockSlim locker = new ReaderWriterLockSlim();

    public static Dictionary<string, object> CacheItems
    {
        get
        {
            return cacheItems;
        }
    }
    ...
}

还应使用 ReaderWriterLockSlim 储物柜对象。

客户端现在看起来如下:

foreach (KeyValuePair<string, object> dictItem in CacheManager.CacheItems)
{
    ...
}

先感谢您。

4

4 回答 4

6

如果您只需要迭代内容,那么坦率地说,它并没有真正用作字典,而是可以使用迭代器块和索引器来隐藏内部对象:

public IEnumerable<KeyValuePair<string, object>> CacheItems
{
    get
    { // we are not exposing the raw dictionary now
        foreach(var item in cacheItems) yield return item;
    }
}
public object this[string key] { get { return cacheItems[key]; } }
于 2012-06-14T07:51:44.780 回答
3

这个楼盘怎么样:

public static IEnumerable<KeyValuePair<string, object> CacheItems
{
    get
    {
        return cacheItems;
    }
}

Dictionary 实现了 IEnumerable 接口(您的 foreach 语句已经使用了该接口),但是通过仅将其真正公开为 IEnumerable 您可以防止向字典添加或删除项目的任何可能性。

如果您需要通过索引运算符访问字典,您可以很容易地实现 ReadOnlyDictionary。然后它看起来像这样:

public class ReadOnlyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
    private IDictionary<TKey, TValue> _Source;

    public ReadOnlyDictionary(IDictionary<TKey, TValue> source)
    {
        if(source == null)
            throw new ArgumentNullException("source");

        _Source = source;
    }

    // ToDo: Implement all methods of IDictionary and simply forward
    //       anything to the _Source, except the Add, Remove, etc. methods
    //       will directly throw an NotSupportedException.
}

在这种情况下,您还可以将缓存传播为

private static ReadOnlyDictionary<string, object> _CacheReadOnly;
private static Dictionary<string, object> _CacheItems;

public static ctor()
{
    _CacheItems = new Dictionary<string, object>();
    _CacheReadOnly = new ReadOnlyDictionary(_CacheItems);
}

public static IDictionary<string, object> CacheItems
{
    get
    {
        return CacheReadOnly;
    }
}

更新

如果你真的需要阻止转换回 Dictionary 你也可以使用这个:

public static IEnumerable<KeyValuePair<string, object> CacheItems
{
    get
    {
        return cacheItems.Select(x => x);
    }
}
于 2012-06-14T07:39:58.013 回答
1

在过滤的字典上公开一个只读视图的属性?尽可能公开允许访问项目的方法。

究竟是什么问题?“不将字典公开”足够模糊,无法回答。

于 2012-06-14T07:37:42.180 回答
0

根据字典的大小,您可以使用MemberwiseClone

您可能还想查看IsReadOnly属性。

于 2012-06-14T08:01:42.353 回答