让我们编写一个程序,对friendy和讨厌的人进行排序。所有字符都是字符,并具有名称。
我们可以将其表示为:
interface ICharacter
{
string GetName();
}
class Character : ICharacter
{
private readonly string name;
public Character(string name)
{
this.name = name;
}
public string GetName()
{
return this.name;
}
}
class Friendly : Character
{
public Friendly(string name)
: base(name)
{
}
}
class Nasty : Character
{
public Nasty(string name)
: base(name)
{
}
}
现在,让我们以这种方式声明并将我们的字符存储到字典中:
Dictionary<Type, IList<ICharacter>> characters = new Dictionary<Type, IList<ICharacter>>();
characters.Add(typeof(Friendly), new List<ICharacter>() { new Friendly("friendly1"), new Friendly("friendly2") });
characters.Add(typeof(Nasty), new List<ICharacter>() { new Nasty("nasty1"), new Nasty("nasty2") });
现在,我们可以编码一种方法,将字典中的所有好友提取为友好好友列表,而不是字符列表:
public static List<Friendly> GetFriendlyPeople(Dictionary<Type, IList<ICharacter>> allPeople)
{
if (allPeople.TryGetValue(typeof(Friendly), out IList<ICharacter> friendly)) {
return friendly as List<Friendly>; //(List<Friendly>)friendly the same result
}
return new List<Friendly>();
}
最后,我们可以调用GetFriendlyPeople:方法
List<Friendly> friends = GetFriendlyPeople(characters);
但返回值为null。我尝试了几种使用接口或不使用接口的组合,结果都是一样的。
在字典中有两种类型,Friendly
和Nasty
。
Dictionary中的列表是ICharacter
的列表——它不是一个类型——它的多个可类型,这就是为什么你得到null的原因。
试试这个,你会得到一个例外,它也会解释你。
return friendly.Cast<Friendly>().ToList()// here you will get now an exception.
如果你想拥有你的Friendly
项目仍然是可能的。试试这个代码。
return friendly.Where(x=> x is Friendly).Cast<Friendly>().ToList(); // here you will get your items.