繁体   English   中英

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

[英]Class specific method in list of different classes

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

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

威廉,

问题在于_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()
  }        
}

问候

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

您要查找的方法是OfType<T> (请参见文档页面 )。 此方法将仅选择所需类型T的列表中的项目。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM