如何将子类字典视为基类的字典

时间:2010-08-11 12:07:14

标签: c# generics inheritance

在C#中,我有一堆对象都继承自同一个基类 我还有一些词典,每个子类都有一个 我想要做的是将所有这些词典添加到一个列表中,这样我就可以循环遍历它们并做一些工作(比如列表等)。

总结

Dictionary<string, Child> childObjects = new Dictionary<string, Child>();
List<Dictionary<string, Parent>> listOfDictionaries = new List<Dictionary<string, Parent>>();
listOfDictionaries.Add(childObjects);

我原以为自从Child继承自Parent之后,这应该可以工作,但是不会编译。显然,我不了解继承和泛型:)

完整的代码示例

class Program
{
    static void Main(string[] args)
    {
        //Creating a Dictionary with a child object in it
        Dictionary<string, Child> childObjects = new Dictionary<string, Child>();
        var child = new Child();
        childObjects.Add(child.id, child);

        //Creating a "parent" Dictionary with a parent and a child object in it
        Dictionary<string, Parent> parentObjects = new Dictionary<string, Parent>();
        parentObjects.Add(child.id, child);
        var parent = new Parent();
        parentObjects.Add(parent.id, parent);

        //Adding both dictionaries to a general list
        List<Dictionary<string, Parent>> listOfDictionaries = new List<Dictionary<string, Parent>>();

        listOfDictionaries.Add(childObjects);  //This line won't compile

        listOfDictionaries.Add(parentObjects);


    }
}

class Parent
{
    public string id { get; set; }
    public Parent()
    {
        this.id = "1";
    }
}

class Child : Parent
{
    public Child()
    {
        this.id = "2";
    }

}

有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:2)

你无法安全地做到这一点。想象一下,你这样做了:

listOfDictionaries[0]["foo"] = new Parent();

看起来很好 - 但这意味着childObjects将包含一个不是Child实例的值!

C#4在安全的位置引入了受限制的通用差异 - 因此您可以将IEnumerable<Banana>类型的引用转换为IEnumerable<Fruit> - 但是您想要的是什么在这里做是不安全的,所以仍然是不允许的。

如果你能告诉我们更多关于更大背景 - 你想要实现的目标 - 我们可以提供更多帮助。您能举例说明之后您想对列表做些什么吗?