更改字典成员的类型

时间:2018-05-09 15:16:45

标签: c# dictionary

在类中,我声明了Dictionary的基类(基类)类型:

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

后来我添加了个体动物(它们都来自动物)

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

Cat拥有名为tail的属性。但是,当我稍后在IDE中尝试访问该成员时,dict["cat"].tail未定义。因为该成员仍然会解析为Animal,而不是Cat类型。

如何强制/更改字典成员的类型,因为dict["cat"].tail在IDE中可用?

P.S。我每次都有吗?到处添加类型到该变量? ((Cat)dict["cat"]...

3 个答案:

答案 0 :(得分:2)

您必须使用as运算符强制转换字典条目,这在dict["cat"]错误地包含Dog的情况下非常有用。在这种情况下使用(Cat)dict["cat"]会抛出异常。

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

字典只会将值视为Animal s,因此每次要使用派生类的成员时都必须进行转换。

正如CodeNotFound在评论中所提到的,Pattern Matching(在C#7中引入)是另一种选择(如果可用)。

if (dict.ContainsKey("cat") && dict["cat"] is Cat cat)
{
    // Dealing with cat :) 
}

答案 1 :(得分:1)

要使用猫的属性尾部,你必须在

之前施放你的猫
((Cat) dict['cat']).tail

因为当你把你的猫放在你的词典中时,如果你试图通过你的词典访问它,它将被视为动物,而你的Animal类在Cat类没有这个属性

PS:如果你只有猫和狗,也许Animal可以拥有这个属性?

答案 2 :(得分:1)

首先,你不必做

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

由于CatDog都来自Animal,您可以直接指定它们

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

现在,要访问单个属性,请使用

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

已通过null运营商

进行了?.检查