从一组对象中获取类型化的项目 - 如何跟踪类型?

时间:2018-04-05 17:51:51

标签: c# class

我实例化了我的课 firedragon 。我将其存储在包含 对象 的公共列表集合中。

List<object> currentEnemies = new List<object>();

我想抓住那个列表项

currentEnemies[0]

并将其转换回我的班级。我只是不知道该怎么做。任何人都可以向我解释如何做到这一点,或者更好的方式来存储我的数据?

注意:我使用保存对象的列表的原因是因为我有许多不同的类可以存储在列表中。

3 个答案:

答案 0 :(得分:3)

处理此问题的一种方法是pattern matching。您可以为currentEnemies实现公共处理程序,例如

foreach (var enemy in currentEnemies) 
{
    switch (enemy) 
    {
        case FireDragon dragon:
            UpdateDragon(dragon);
            break;
        case Bulbasaur plant:
            BeAdorable(plant);
            break;
        // and so on... 
    }
}

如果你只有少数几种类型,并且未来不会有更多的东西(仔细考虑这一点),这不是太糟糕,但很快就会变得非常麻烦。

理想情况下,你应该寻找敌人的共同元素,以便你可以简化这一点。例如,如果你有代码在每一步移动世界上的敌人,他们都可以实现一个共同的界面,

interface IMobile 
{
    (int X, int Y) Move(int x, int y);
    int Speed { get; }
}

然后用于处理敌人移动的代码可能只是,

var mobiles = new List<IMobile>(); 

// then in other code that can access `mobiles`
foreach (var mobile in mobiles)
{
    mobile.Move(mobile.Speed);
}

答案 1 :(得分:1)

通常,当您直接控制要从列表中插入和删除的项目以使用object作为List的泛型类型时,这是一个坏主意。这听起来像是你正在构建一个游戏,如果你是我,我会使用接口来构建它,然后使用OfType<>相当多。

// Anything you want to track in the game
public interface IGameEntity {}
// Anything that opposes a plyaer
public interface IEnemy : IGameObject {}
// Anything used to do Physical Harm
public interface IWeapon : IGameObject {}
// Anything that can be collected for a purpose (wood, gold, etc)
public interface IResource : IGameObject {}

老实说,我不确定红龙是否会与蓝龙大不相同,我会假设不是这样我只会创建一个Dragon类

public class Dragon : IEnemy
{
  public DragonColor Color { get; set; }
}

public enum DragonColor
{
  Red,
}

然后你列出的是:

List<IGameEntity> entities;

所有龙都是

var dragons = entities.OfType<Dragon>();

答案 2 :(得分:0)

我有一种感觉,你正在寻找使用作文的解决方案。示例:

public class Enemies { 
  public FireDragon TheDraggon { get; set; } 
  public List<Troll> Trolls { get; set; } 
  /* other enemies that you need to track */
}

使用这种方法,您不必猜测或检查实例在对象列表中的类型。