首页 > 解决方案 > c#如何将所有字典放入Dictionary的派生类型对象中?

问题描述

class XDictionary<TKey, TValue> : Dictionary<string, string>
{
}

        Dictionary<string, string> d = new Dictionary<string, string>
        {
            { "x", "xx" },
            { "y", "yy" },
            { "z", "zz" }
        };

        XDictionary<string, string> x;

有没有办法在没有 foreach 的情况下将 d 放入 x 中,只使用向上转换/向下转换?

标签: c#dictionaryinheritancedowncastupcasting

解决方案


首先,您必须遍历项目(这不是问题)的原因是因为您想复制它们。

如果您只是将字典作为新的内部表示来引用,那么您将有多个对象处理相同的数据。

不过,这与您从它继承无关 - 当您从另一个字典(而不是 xDictionary)创建新字典时 - 您会想要同样的东西。

至于向下转换 - 这通常是不可能的,除非您要转换的类型与运行时类型本身或它们之间的层次结构中的任何内容相匹配。

所以你不会以某种方式迭代它,但你可以将它传递给已经实现了这个的基本副本构造函数:

class XDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    public XDictionary() { }
    public XDictionary(IDictionary<TKey, TValue> dict) : base(dict) { }
}

Dictionary<string, string> d = new Dictionary<string, string>
{
    { "x", "xx" },
    { "y", "yy" },
    { "z", "zz" }
};

XDictionary<string, string> xDict = new XDictionary<string, string>(d);

另请注意,当您为您的类声明泛型类型参数时,您必须将它们转发到您的基类以使其有意义。


我不同意您问题下方的一些评论。

有一个准则说prefer composition over inheritance,这确实有它的原因。但是,教条主义是没有帮助的,因为对于组合:

  • 您确实必须编写更多代码才能真正实现相同的基本功能。
  • 您有一个额外的对象散布在堆上。

因此,如果您的意图不是将 Dictionary 更改为其他东西 - 而是扩展它的功能 - 从它继承绝对没问题。

为了清楚起见,您可以问自己这个问题:

我的实现应该某种字典(继承),还是使用字典(组合)。

使用继承时需要注意一些事项,但是当您不以任何方式更改内部表示和相等/比较机制时,您现在就可以了。


如果您想更多地修改字典而不仅仅是扩展它,也请考虑将其System.Collections.DictionaryBase用作您的基类。

这个抽象类仍将为您完成大部分繁重的工作,但通过抽象为您的实现提供更多自由。


推荐阅读