重载字典子类中的索引运算符

本文关键字:索引 运算符 字典 子类 重载 | 更新日期: 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.");
        }
    }
}