不同类别列表中特定于类别的方法

时间:2018-12-27 14:28:17

标签: c# list class

所以我有一个包含不同类的列表,所有类都继承自一个公共类。现在我想调用特定于这些子类之一的方法,但是我似乎找不到合适的代码来做到这一点,有人可以帮忙吗? 错误的代码部分(无法访问敌人列表):

if (_floor.GetRoomByIndex(CheckActiveRoomIndex()).GetType() == typeof(StandardRoom))
{
    for (int i = 0; i < _floor.GetRoomByIndex(CheckActiveRoomIndex()).enemies.Count; i++)
    {
        _floor.GetRoomByIndex(CheckActiveRoomIndex()).enemies[i].UpdateBoundingBox();
    }
}

这是我的StandardRoom类的一部分

class StandardRoom : CommonBaseClass
{
    public bool IsCleared { get; set; }
    public List<Enemy> ennemies = new List<Enemy>();
    ...
}

2 个答案:

答案 0 :(得分:2)

威廉,

问题在于_floor.GetRoomByIndex(CheckActiveRoomIndex())不是 StandardRoom ,而是 Room (或基类,无论名称如何)

1 /解决方案更接近现有代码 缺少转换,因此可以将房间视为 StandardRoom :使用 as 关键字以安全的方式进行转换。

不要重复自己(DRY原理),声明一个变量(stdRoom)。

StandardRoom stdRoom = _floor.GetRoomByIndex(CheckActiveRoomIndex()) as StandardRoom;
if ( stdRoom != null )
{
  for (int i = 0; i < stdRoom.enemies.Count; i++)
  {
      stdRoom.enemies[i].UpdateBoundingBox();
  }
}

如下文中的Olivier所述,通过 C#7模式匹配(Visual Studio 2017+),演员表可以更短:

if ( _floor.GetRoomByIndex(CheckActiveRoomIndex()) is StandardRoom stdRoom )

2 / Linq答案

Enumerable.SelectMany可用于从房间中获取敌人

if ( _floor.GetRoomByIndex(CheckActiveRoomIndex()) is StandardRoom stdRoom )
{
  // projection to get Enemies from StandardRoom
  foreach( Enemy e in stdRoom.SelectMany( r => r.enemies ) )
  {
    e.UpdateBoundingBox()
  }        
}

致谢

答案 1 :(得分:1)

LINQ有大量可用方法。阅读documentation或只是谷歌的“ LINQ方法”。

您要寻找的方法是OfType<T>(请参阅documentation page)。此方法只会选择所需类型T的列表中的项目。