遍历 List<interface> 项目

Bla*_*dly 2 c# iteration interface list

我不知道为什么我不能通过我接口的类遍历列表。

例如。

public interface IAnimal
{
   string Name { get; set; }
}

public class Chicken:IAnimal
{
   public string Name { get; set; }
}

public class Dog:IAnimal
{
   public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var AnimalList = new List<IAnimal>();

        var Chicken1= new Chicken() { Name = "Chicken" }; 
        var Dog1= new Dog() { Name = "Dog" };

        AnimalList.Add(Dog1);
        AnimalList.Add(Chicken1);

        foreach (Dog obj in AnimalList)
        {
           Console.WriteLine(obj.Name); 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我做错了什么,有没有更好的角度来处理这种情况。

Eni*_*ity 5

您已经定义了您的列表,以便它包含 的元素IAnimal

var AnimalList = new List<IAnimal>();
Run Code Online (Sandbox Code Playgroud)

然后在循环中将元素指定为Dog. 现在 whileDog确实实现了IAnimal它不是唯一的类型。因此,如果列表包含的类型不是Dog那么您的循环就会失败。

所以你有两种方法来解决这个问题。

一是你改变你的循环是这样的:

foreach (IAnimal obj in AnimalList)
{
    Console.WriteLine(obj.Name); 
}
Run Code Online (Sandbox Code Playgroud)

如果你这样做,你的代码就可以正常工作并输出狗和鸡的名字。

但是,如果您只想返回Dog实例,您可以过滤列表。你会这样做:

foreach (Dog obj in AnimalList.OfType<Dog>())
{
    Console.WriteLine(obj.Name); 
}
Run Code Online (Sandbox Code Playgroud)

现在它只会输出狗的名字。