【问题标题】:Iterating through List<interface> Items遍历 List<interface> 项
【发布时间】:2015-07-05 01:02:57
【问题描述】:

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

例如。

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); 
        }
    }
}

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

【问题讨论】:

  • 你真的没有解释这段代码出了什么问题。
  • 我可能正在阅读您的问题,但如果您尝试仅在循环中点击 Dog 对象,则对其进行过滤。 foreach (Dog obj in AnimalList.OfType&lt;Dog&gt;())

标签: c# list interface iteration


【解决方案1】:

您已定义列表,使其包含IAnimal 的元素。

var AnimalList = new List<IAnimal>();

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

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

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

foreach (IAnimal obj in AnimalList)
{
    Console.WriteLine(obj.Name); 
}

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

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

foreach (Dog obj in AnimalList.OfType<Dog>())
{
    Console.WriteLine(obj.Name); 
}

现在只输出狗名。

【讨论】:

    【解决方案2】:

    每个Dog 都是一个 IAnimal,但不是每个IAnimal 都是一个 Dog。尤其不是Chicken:绝对不是Dog。这就是为什么这个循环在到达Chicken 时会遇到异常:

    foreach (Dog obj in AnimalList) {
        ...
    }
    

    但是,如果你这样做

    foreach (IAnimal obj in AnimalList) {
        ...
    }
    

    或等价物

    foreach (var obj in AnimalList) {
        ...
    }
    

    代码将正确编译和运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2021-10-18
      • 2018-01-22
      • 2012-01-09
      • 2018-06-10
      相关资源
      最近更新 更多