在多个类类型的列表中调用特定的类函数

时间:2013-06-19 00:42:06

标签: c# list class inheritance crash

我正在尝试使用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'."

基本上,我有一个完整的不同类的列表。如何在循环中的类中访问特定函数而不会使程序崩溃,因为它在没有所述函数的另一类类上尝试它。

3 个答案:

答案 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();
}