2017-09-29 26 views
-1

铸造的接口的对象我有一个包含很多不同的方法,几个对象:在C#

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

我想把狗和猫的list成组合列表。从那里我想创建一个幻灯片并分别播放每个项目。所以我做了一个接口:

public Interface IAnimal 
     public playAnimal() 

我有一个catItem,并且扩展了该接口dogItem

我的问题就出在这里,我不能合并列表。每次我这样做都说我没有正确输出:

我想将它添加到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#。有没有我不明白的理解?

+1

'Cast'不返回一个列表。它返回一个'IEnumerable',然后尝试添加一个'ToList'。 – juharr

+4

狗和猫都不是'AnimalItem'。你不应该将它们投射到“IAnimal”吗? –

+0

@jdmdevdotnet是一个*列表*的动物。你输入的内容会丢失。 –

回答

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); 
+0

这很有道理。字典狗列表是否会阻止投射?我正在阅读错误消息,它说我的数据是一个System.Collections.ListDictionaryInternal – lost9123193

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>

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>(); 
    } 
} 
+0

谢谢这真的很有帮助。我仍然收到一个错误“无法将对象Dog转换为IAnimal)。字典狗列表是否会阻止投射?我正在阅读错误消息,它说我的数据是一个System.Collections.ListDictionaryInternal – lost9123193

+0

我不会认为是 - Dictionary和List都是IEnumerable,所以不应该改变任何东西。如上所述,显示更多的代码可能有助于发现哪部分是错误的。 – David

+0

仔细看看你的行:'var dogList = newDogData.Where(dog => anyDog.anySpecies()。toList());'与我的行'var dogList = newDogData.Where(dog => dog.anySpecies())。ToList();'我必须改变有几个重要的细节可以让它编译,例如,anyDog是从哪里来的?还要注意Where'Where'的右括号向内移动,我敢打赌你的问题与这条线有关。 – David