C# 在泛型中从T1转换继承的T2对象?
问题是:C# 在泛型中从T1转换继承的T2对象?,c#,.net,class,oop,inheritance,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
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
公共类实体{…}
公共类项:实体{…}
...
List EntityList=新列表();
List ItemList=新列表();
EntityList.Add(ItemList[0])//ItemList包含一些对象项
现在,EntityList[0]
包含项
对象,但它有实体
作为.GetType
,并且没有任何项
属性,因为它“转换”了对象。是否有任何方法
可以从实体“转换”回项
我还想知道:当您将对象添加到父类类型的列表中,然后重建为父类类型的对象时,对象是否会被销毁?没有任何内容被销毁或重建,这都与引用和变量的类型有关 您可以将
奶牛
保存在列表
中,但猴子
和熊
也可以。您将从列表的枚举器返回的项目将在列表中声明类型,在本例中为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()
,而不关心动物如何进食
因此,您实际遇到的问题是,您有一个
实体
的列表,而实际上您对实体
不感兴趣,但是在项
中,您需要转换项,但是您的体系结构存在一个更大的问题。任何时候你这样做几乎肯定意味着你的代码结构设计得很糟糕,应该重新修改。ItemList[0]
引用的对象正是EntityList[0]
引用的对象。只有引用具有不同的类型。这称为-使用父类型引用指向子类型实例的能力。还有一种LINQ扩展方法(使用System.LINQ
),可用于按类型筛选项:EntityList.OfType()
)。