2017-09-29 27 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