Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在泛型中从T1转换继承的T2对象?_C#_.net_Class_Oop_Inheritance - Fatal编程技术网

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()
)。