在类中,我声明了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"]...
答案 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();
由于Cat
和Dog
都来自Animal
,您可以直接指定它们
dict["cat"] = new Cat();
dict["dog"] = new Dog();
现在,要访问单个属性,请使用
(dict["cat"] as Cat)?.tail
已通过null
运营商
?.
检查