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