6

たとえば、基本クラス がありEntity、次に、これから派生する 2 つのサブクラスがLightEntityありPlayerEntityます。

次に、s とsList<Entity> Entitiesを保持する a があります。LightEntityPlayerEntity

LightEntityからすべての sを取得したいEntities

私は試した:

List<LightEntity> lights = new List<LightEntity>();
foreach (Entity ent in Entities)
{
    if(ent is LightEntity)
    {
        lights.Add(ent);
    }
}

Entityしかし、コンパイラは、 のリストにだけを追加しようとする可能性があるとまだ考えているように見えるので、これは好きではありませんLightEntity

にキャストしようとしましentLightEntityが、コンパイラは、 を に変換する方法がないと言っていEntityますLightEntity

4

5 に答える 5

14

OfTypeタイプ別にエンティティをフィルタリングするために使用できます。

List<LightEntity> lights = new List<LightEntity>();
lights.AddRange(entities.OfType<LightEntity>());

またはさらに簡単:

List<LightEntity> lights = entities.OfType<LightEntity>().ToList();

参考文献

于 2013-05-09T21:27:31.073 に答える
5

ent を (LightEntity) にキャストするだけです。

Lights.Add((LightEntity)ent);
于 2013-05-09T21:26:24.113 に答える
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);
    }
}
于 2013-05-09T21:29:39.363 に答える
1

あなたはlinqでそれを行うことができます...

 var lights = Entities.Where(e => e is LightEntity)
                      .Select(e => (LightEntity)e)
                      .ToList();
于 2013-05-09T21:28:28.000 に答える
0

さて、まずは。なぜこれを行っているのかわかりませんが、これが問題を解決する最善の方法ではないことは確かです。おそらく、派生クラスは同じ基本クラスまたは類似のものを持つべきではありません。それについて助けが必要な場合は、全体像を提供してください。

すでに投稿されているように、キャストは問題の解決策です。

Lights.Add((LightEntity)ent);
于 2013-05-09T21:29:31.843 に答える