[英]Send different and alternate Classes as parameters to create a specific List<>
[英]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()
}
}
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.