Вам просто нужно переопределить индексатор на 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();
}