我正在尝试使用C#进行2D游戏(使用XNA与问题无关)。我制作了一个基本的瓷砖类,游戏中的所有瓷砖都将从中继承基本功能,比如如何将自己绘制到屏幕上等等。
我所拥有的是一个基础tile类的列表,它包含从基类继承的每一个其他类,I.E:Doors,Walls,Floor-tiles等。
List<TileBase> tileList = new List<TileBase>();
...
tileList.Add(new Door(arguments));
tileList.Add(new Wall(arguments));
当我想要仅影响该列表中的某种类型的类时,问题会出现。例如,门具有Open(),Close()和Toggle()的某些功能。 如果我试着简单地创建一个遍历列表中每个Door类的循环:
foreach(Door door in tileList)
{
door.Toggle();
}
我收到错误:
"Unable to cast object of type '...Tiles.Wall' to type '...Tiles.Door'."
基本上,我有一个完整的不同类的列表。如何在循环中的类中访问特定函数而不会使程序崩溃,因为它在没有所述函数的另一类类上尝试它。
答案 0 :(得分:1)
您可以调查OfType方法,它会根据类型进行过滤:
using System.Linq;
...
foreach(var door in tileList.OfType<Door>())
{
door.Toggle();
}
答案 1 :(得分:0)
您可以使用基类进行迭代,然后检查特定对象是否是Door
类的实例。如果是,则转换为Door
对象。
foreach(TileBase td in tileList)
{
if(td is Door)
{
((Door) td).Toggle();
}
}
答案 2 :(得分:0)
foreach(Door door in tileList.where(a=>a is Door))
{
door.Toggle();
}