从基类对象列表中识别派生类型

5 c# inheritance types class derived

这可能看起来像"家庭作业"和/或微不足道,但它是出于真正的商业目的; 这是我能想到解释我在概念上试图做的最简单的方法.

假设我有一个Animal类,以及其他一些类(Bird,Cat,Kangaroo).其中每一个都来自Animal.

动物可能看起来像这样:

public class Animal
{
    public Animal()
    {

    }

    public string Name { get; set; }
    public string AnimalType { get; set; }
    public List<Animal> Friends { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

袋鼠可能看起来像这样:

public class Kangaroo : Animal
{
    public Kangaroo()
    {

    }

    public int TailLengthInches { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设袋鼠有两个朋友,一只鸟和一只猫.我怎么能将这些添加到"动物"朋友列表(作为动物类型),但保留访问派生类属性的能力?(例如,我仍然需要能够使用特定于动物类型的属性,例如鸟类的羽毛颜色,即使它们只被视为"动物".

我试图这样做的原因是,当我后来获得动物的"朋友"列表时,我知道朋友是什么类型的动物是至关重要的.根据动物类型(无论是鸟类,猫等),我想做一些不同的事情(实际上,在ASP.NET页面上显示不同的模板,但我并不需要特别的帮助).

我想这可以归结为...如果我有一个Animal列表,我怎么知道列表中每个对象的派生类型是什么,所以我可以将它们转换回派生类型或做其他事情这允许我到达每个派生类型的特定,不同的属性?

谢谢!

Jar*_*Par 8

您可以使用LINQ过滤您正在寻找的类型

animals.Friends = new List<Animal> { new Kangaroo(), new Bird() };
foreach ( var kangaroo in animals.Friends.OfType<Kangaroo>()) {
  kangaroo.Hop();
}
Run Code Online (Sandbox Code Playgroud)