重载字典子类中的索引运算符
本文关键字:索引 运算符 字典 子类 重载 | 更新日期: 2023-09-27 18:36:54
我遇到这样一种情况:当服务启动时,我已经将一组数据重建为 .NET 字典已有一段时间了。 最近,这组数据变得如此之大,我决定只考虑按需构建 kev/value 对象。 所以我的虽然是,从字典继承,并重载索引运算符。 在那里,我将检查集合是否包含键(并返回值),如果没有,我将创建对象将其填充到集合并返回它。
我尝试以下代码(为简单起见,我只是制作了字符串类型的值,而不是我实际创建的相当复杂的对象):
public class BroadcastDictionary<TKey, TItem> : Dictionary<TKey, TItem>
{
public string this[TKey key]
{
get
{
if (!base.ContainsKey(key))
{
try
{
//Construct the object and put it
// into the collection:
string newValue = "new value!";
base.Add((TKey)key, (TItem)newValue);
}
catch
{
;// Log the lazy object generation failure
}
}
if (base.ContainsKey(key))
return base[key].ToString();
else
throw new Exception("BroadcastDictionary value object lazy load failure.");
}
}
}
但是,我因无法使用Dictionary.Add(key, value)
插入值而挂断电话。 关于如何修复并使这段代码正常运行的任何想法?
编辑:问题是上面的代码无法编译。 在base.Add((TKey) key, (TItem)newValue);
编译器报告错误"错误 2 无法将类型'字符串'转换为'TItem'"。
为此,您作为 Add 的值参数传递的内容需要是一个 TItem。字典的值类型是 TItem,因此您可以向其添加这些值。索引方法还应使用 new 关键字。只要 TItem 具有公共无参数构造函数,下面的代码就可以懒惰地创建它:
public class BroadcastDictionary<TKey, TItem> : Dictionary<TKey, TItem> where TItem : new()
{
public new string this[TKey key]
{
get
{
if (!base.ContainsKey(key))
{
try
{
//Construct the object and put it
// into the collection:
var item = new TItem();
base.Add(key, item);
}
catch
{
;// Log the lazy object generation failure
}
}
if (base.ContainsKey(key))
return base[key].ToString();
else
throw new Exception("BroadcastDictionary value object lazy load failure.");
}
}
}