Как трактовать словарь подклассов как словарь базового класса - PullRequest
0 голосов
/ 11 августа 2010

В 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 Ответ

2 голосов
/ 11 августа 2010

Вы не можете сделать это безопасно. Представьте, что вы сделали это:

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

Это выглядит нормально - но это будет означать, что childObjects будет содержать значение, которое не является экземпляром Child!

C # 4 ввел ограниченную универсальную дисперсию, где она безопасна - так что вы можете преобразовать ссылку типа IEnumerable<Banana> в IEnumerable<Fruit>, например - но то, что вы хотите сделать здесь, не безопасно, так что это все еще не разрешено.

Если бы вы могли рассказать нам больше о более широком контексте - чего вы пытаетесь достичь - мы могли бы помочь больше. Можете ли вы привести примеры того, что вы хотели бы сделать со списком впоследствии?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...