2013-09-30 51 views
2

我有一個快速問題。從抽象類型對象數組訪問特定子類的對象

我有幾個類,說Class SubA,SubB和SubC。 我也有一個抽象類,讓我們說父母

所以我有一個父對象的數組,其中包含SubA,SubB和SubC的實例。

我基本上試圖通過數組或循環來獲取SubA的特定實例。

我已經trieed以下,但它產生的異常類型:

foreach (SubA a in Parent.GetList()) 

任何幫助,將不勝感激。

+0

如果我嘗試使用OFType方法,我得到一個編譯錯誤,因爲System.Array不能控制這個方法 - 我猜我的方法調用GetList()通過你。這只是一個簡單的數組 - 是否有一個等價的方法? –

回答

6

是的,當前的代碼有一個隱式轉換,如果您的collection中有「錯誤」類型的對象,則該轉換將失敗。我建議你使用LINQ的OfType方法:

using System.Linq; // Make LINQ extension methods available 

... 

foreach (SubA a in Parent.GetList().OfType<SubA>()) 
{ 
    ... 
} 

注意a永遠不會爲空在上面 - 我假設沒關係。

+0

它只是一個簡單的數組,所以它沒有OfType方法。有沒有另一種方法可以爲數組做同樣的事情? –

+1

@PectusExcavatum:數組實現'IEnumerable',所以只要你有'使用System.Linq;'它應該沒問題。 –

+0

謝謝喬恩,那是我的錯誤。謝謝你的幫助;非常感謝:-) –

5

使用OfType<T>記錄here

foreach(SubA a in Parent.GetList().OfType<SubA>()) 
0

要獲得特定的實例,可以在數組上使用Single或SingleOrDefault擴展方法。如果集合不包含匹配元素,Single將拋出異常; SingleOrDefault將返回null。

如果你正在尋找一個特定類型的

var result = parents.Single(p => p is SubA); 

的一個對象。如果對象有一個關鍵

var result = parents.Single(p => p is SubA and p.Id == id); 

或者你提供一切條件允許您識別實例。