Изменить тип словаря - PullRequest
0 голосов
/ 09 мая 2018

В классе я объявляю общий (базовый класс) тип словаря:

private Dictionary<string, Animal> dict = new Dictionary<string, Animal>();

позже я добавляю отдельных животных (все они происходят от животных)

dict["cat"] = (Cat) new Cat();
dict["dog"] = (Dog) new Dog();

Кошка имеетсвойство с именем tail.Однако, когда я пытаюсь получить доступ к этому члену позже в IDE, dict["cat"].tail не определено.Поскольку этот элемент разрешается до Animal все еще, вместо Cat type.

Как я могу принудительно / изменить тип члена словаря, когда dict["cat"].tail станет доступным в IDE?

PS Каждый раз и везде я добавляю тип к этой переменной?((Cat)dict["cat"]...

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Чтобы использовать свойство хвоста вашей кошки, вы должны бросить свою кошку до

((Cat) dict['cat']).tail

потому что, когда вы помещаете свою кошку в свой словарь, она будет считаться животным, если вы попытаетесь получить к ней доступ через свой словарь, и у вашего класса животных нет этого свойства, в то время как класс Cat имеет

PS: Если у вас есть только кошки и собаки, может быть, у Animal может быть эта собственность?

0 голосов
/ 09 мая 2018

Во-первых, вам не нужно делать

dict["cat"] = (Cat) new Cat();
dict["dog"] = (Dog) new Dog();

, поскольку Cat и Dog являются производными от Animal, вы можете назначить их напрямую

dict["cat"] = new Cat();
dict["dog"] = new Dog();

Теперь, чтобы получить доступ к отдельным свойствам, используйте

(dict["cat"] as Cat)?.tail

, в который уже включена проверка null через оператора ?.

0 голосов
/ 09 мая 2018

Необходимо преобразовать словарную запись, используя оператор как , что полезно в случае, если dict["cat"] по ошибке содержит Dog. Использование (Cat)dict["cat"] вызовет исключение в этой ситуации.

if (dict.ContainsKey("cat"))
{
    Cat dictCat = dict["cat"] as Cat;
    if (dictCat != null)
    {
        // use dictCat
    }
}

Словарь будет рассматривать только значения как Animal s, поэтому вам действительно придется приводить каждый раз, когда вы хотите использовать член производного класса.

Как упомянуто CodeNotFound в комментариях, Сопоставление с образцом (введено в C # 7) - это еще один вариант, если он доступен.

if (dict.ContainsKey("cat") && dict["cat"] is Cat cat)
{
    // Dealing with cat :) 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...