在C#中将接口转换为对象

时间:2017-09-29 16:04:50

标签: casting

我有一些包含许多不同方法的对象:

   public class Dog: AnimalDescription, IAnimal
   public class Cat: AnimalDescription, IAnimal

我想将list狗和猫放入组合列表中。从那里我想创建幻灯片并分别播放每个项目。所以我做了一个界面:

   public Interface IAnimal
       public playAnimal()

我有catItemdogItem扩展此界面。

我的问题在于,我无法将列表合并。每次我这样做都说我没有正确地投射它:

我想将它添加到AnimalInterface列表中,并根据类的类型浏览每个catItem或dogItem方法(playAnimal)。我有一个为动物创建幻灯片的课程: 但以下不起作用:

   public class AnimalSlideshow

   IEnumerable<IAnimal> AnimalItemList;


   setUpSlideshow(list<Dogs> newDogData){
      var dogList = newDogData.Where(dog => anyDog.anySpecies().toList());

      //The dogList is a type List<Dog>.

       AnimalItemList = dogList.Cast<IAnimal>();
   }

它说我不能施放狗来输入IAnimal。我很困惑,因为我将接口添加到Dog类。我刚刚开始学习C#。有没有我错误理解的东西?

3 个答案:

答案 0 :(得分:1)

如果要在动物列表中组合猫和狗,则应使用Enumerable.Concat运算符。

您必须首先将第一个列表转换为IEnumerable<IAnimal>

interface IAnimal{}

public class Cat:IAnimal{}

public class Dog:IAnimal{}

var cats=new List<Cat> {
   new Cat(),
   new Cat()
};
var dogs=new List<Dog> {
   new Dog(),
   new Dog()
};

var animals = cats.Cast<IAnimal>()
                  .Concat(dogs)
                  .ToList();

Debug.Assert(animals.Count == 4);

答案 1 :(得分:0)

考虑这个例子:

  class Program {
    static void Main(string[] args) {
      List<Dog> dogs = new List<Dog>();
      dogs.Add(new Dog());
      dogs.Add(new Dog());
      dogs.Add(new Dog());

      var x = dogs.Where(dog => true).ToList();
      var y = x.Cast<IAnimal>();
      var z = y.ToList();

    }
  }
  public class Dog :  IAnimal { }
  public class Cat :  IAnimal { }
  public interface IAnimal { }

在这个例子中,
x的类型为List<Dog> y的类型为IEnumerable<IAnimal> z的类型为List<IAnimal>

答案 2 :(得分:0)

我认为我们需要更多代码/更多信息,了解背景情况。我已经使用了你提供的代码,稍微调整它以使其编译,然后在LinqPad中运行它并且它工作得很好(见下文)。我认识到魔鬼在细节中,所以我所做的一些假设可能与你实际做的不同。

void Main()
{
    AnimalSlideshow slides = new AnimalSlideshow();
    slides.setUpSlideshow(new List<Dog> { new Dog()});
    Console.WriteLine("Done!");
}

public interface IAnimal
{
    void playAnimal();
}

public class AnimalDescription
{ }
public class Dog : AnimalDescription, IAnimal
{
    public void playAnimal() { }
    public bool anySpecies() {return true;}
}
public class Cat : AnimalDescription, IAnimal
{
    public void playAnimal() {}
}

public class AnimalSlideshow
{
    IEnumerable<IAnimal> AnimalItemList;

    public void setUpSlideshow(List<Dog> newDogData)
    {
        var dogList = newDogData.Where(dog => dog.anySpecies()).ToList();

        //The dogList is a type List<Dog>.

        AnimalItemList = dogList.Cast<IAnimal>();
    }
}