1

我正在尝试使用 C# 制作 2D 游戏(使用与问题无关的 XNA)。我制作了一个基本的瓷砖类,游戏中的所有瓷砖都将从中继承基本功能,例如如何将自己绘制到屏幕上等等。

然后,我拥有的是该基础瓷砖类的列表,其中包含从基类继承的所有其他类,即:门、墙、地板瓷砖等。

    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'."

所以基本上,我有一个充满不同课程的列表。我如何在循环中到达一个类中的特定函数而不使程序崩溃,因为它在另一种类型的没有所述函数的类上尝试它。

4

3 回答 3

1

您可以调查 OfType 方法,它根据类型进行过滤:

using System.Linq;

...

foreach(var door in tileList.OfType<Door>())
{
    door.Toggle();
}
于 2013-06-19T00:45:47.670 回答
0

您可以使用基类进行迭代,然后检查特定对象是否是Door该类的实例。如果是,则投射到Door对象。

foreach(TileBase td in tileList)
{
       if(td is Door)
       {
             ((Door) td).Toggle();
       }
}
于 2013-06-19T00:50:16.517 回答
0
foreach(Door door in tileList.where(a=>a is Door))
{
    door.Toggle();
}
于 2013-06-19T02:37:22.163 回答