从通用转换T1继承的T2对象?

时间:2019-06-20 08:51:33

标签: c# .net class oop inheritance

问题是:

public class Entity {...}

public class Item : Entity {...}

...

List<Entity> EntityList = new List<Entity>();

List<Item> ItemList = new List<Item>();

EntityList.Add(ItemList[0]); //ItemList contains some object Item

现在EntityList[0]包含Item对象,但它具有Entity作为.GetType的对象,并且没有任何Item属性,因为它是“转换”对象。是否有任何method可以从实体“转换”回Item

我还想知道:将对象添加到具有父类类型的列表时,对象是否被破坏,然后重新构建为父类型对象?

1 个答案:

答案 0 :(得分:3)

没有任何东西被破坏或重建,这全都与引用和变量类型有关。

您可以将Cow保存在List<Animal>中,但是MonkeyBear也可以保存。从列表的枚举器中取回的项目将具有在列表中声明的类型,在这种情况下为Animal,在您的情况下为Entity

您必须对每种可能性进行投射和测试:

foreach (var entity in EntityList)
{
    if (entity is Item i)
    {
        // do something with i
    }
    if (entity is AnotherType a)
    {
        // do something with a
    }
}

但是,当您希望将列表的全部内容都视为相同时,可以使用基本类型的列表。例如,因为您想对所有的动物都叫Animal.Eat(),所以您并不在乎动物如何进食。

因此,您遇到的实际问题是,您有一个Entity列表,而您实际上对Entity并不感兴趣,但是对Item感兴趣。