例如,我有一个基类Entity
,然后是两个子类,派生自LightEntity
和PlayerEntity
。
然后我有一个List<Entity> Entities
,其中包含LightEntity
和PlayerEntity
s。
我希望从LightEntity
获取所有Entities
。
我试过了:
List<LightEntity> lights = new List<LightEntity>();
foreach (Entity ent in Entities)
{
if(ent is LightEntity)
{
lights.Add(ent);
}
}
但它并不喜欢这样,因为编译器似乎仍然认为它可能只会尝试将Entity
添加到LightEntity
列表中。
我尝试将ent
转换为LightEntity
,但编译器表示它没有将Entity
转换为LightEntity
的方法。
答案 0 :(得分:13)
您可以使用OfType
按类型过滤实体:
List<LightEntity> lights = new List<LightEntity>();
lights.AddRange(entities.OfType<LightEntity>());
甚至更容易:
List<LightEntity> lights = entities.OfType<LightEntity>().ToList();
进一步阅读
答案 1 :(得分:5)
刚刚施放(LightEntity) 所以
Lights.Add((LightEntity)ent);
答案 2 :(得分:2)
List(Of T)扩展解决方案已经编写好了,让我以老式的方式展示
List<LightEntity> lights = new List<LightEntity>();
foreach (Entity ent in Entities)
{
LightEntity le = ent as LightEntity
if(le != null)
{
lights.Add(le);
}
}
答案 3 :(得分:1)
你可以用linq ...
来做 var lights = Entities.Where(e => e is LightEntity)
.Select(e => (LightEntity)e)
.ToList();
答案 4 :(得分:0)
嗯,首先。我不知道你为什么这样做,但我很确定这不是解决问题的最佳方法。可能你的派生类不应该有相同的基类或类似的东西。如果你需要帮助,你应该给我们更大的图片。
正如已经发布的那样,施法是解决问题的方法。
Lights.Add((LightEntity)ent);