C#4.0中字典元素的吸气剂

我想实现一个仅在访问元素时(而不是提前访问)动态创建其自身元素的字典.为此,我想使用getter方法,但我只是找不到任何有关如何在字典元素的上下文中声明getter的信息.

我确实知道如何在整个字典中添加一个吸气剂(调用时必须返回一个字典),但是我想做的是实现一个当访问字典中的单个元素时调用的吸气剂,以便我可以创建该元素在飞行中.该getter必须接收用于请求的键作为参数,并且它必须返回相应的值.

我在文档中找不到该任务的任何语法.

解决方法:

您只需要在Dictionary<,>上重新实现索引器.

    public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    public new TValue this[TKey key]
    {
        get
        {
            TValue value;
            if (!TryGetValue(key, out value))
            {
                value = Activator.CreateInstance<TValue>();
                Add(key, value);
            }
            return value;
        }
        set { base[key] = value; }
    } 
}

如果您需要更复杂的值实例化,则可以使用激活器功能

 public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    readonly Func<TKey, TValue> _activator;

    public MyDictionary(Func<TKey, TValue> activator)
    {
        _activator = activator;
    }

    public new TValue this[TKey key]
    {
        get
        {
            TValue value;
            if (!TryGetValue(key, out value))
            {
                value = _activator(key);
                Add(key, value);
            }
            return value;
        }
        set { base[key] = value; }
    } 
}

用法:

static void Main(string[] args)
{
    var dict = new MyDictionary<int, string>(x => string.Format("Automatically created Value for key {0}", x));
    dict[1] = "Value for key 1";
    for (int i = 0; i < 3; i++)
    {
        Console.WriteLine(dict[i]);
    }
    Console.Read();
}
上一篇:iOS的分类


下一篇:c#-不安全结构中的只读数组字段