我想实现一个仅在访问元素时(而不是提前访问)动态创建其自身元素的字典.为此,我想使用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();
}