我有一個快速問題。從抽象類型對象數組訪問特定子類的對象
我有幾個類,說Class SubA,SubB和SubC。 我也有一個抽象類,讓我們說父母
所以我有一個父對象的數組,其中包含SubA,SubB和SubC的實例。
我基本上試圖通過數組或循環來獲取SubA的特定實例。
我已經trieed以下,但它產生的異常類型:
foreach (SubA a in Parent.GetList())
任何幫助,將不勝感激。
我有一個快速問題。從抽象類型對象數組訪問特定子類的對象
我有幾個類,說Class SubA,SubB和SubC。 我也有一個抽象類,讓我們說父母
所以我有一個父對象的數組,其中包含SubA,SubB和SubC的實例。
我基本上試圖通過數組或循環來獲取SubA的特定實例。
我已經trieed以下,但它產生的異常類型:
foreach (SubA a in Parent.GetList())
任何幫助,將不勝感激。
是的,當前的代碼有一個隱式轉換,如果您的collection中有「錯誤」類型的對象,則該轉換將失敗。我建議你使用LINQ的OfType
方法:
using System.Linq; // Make LINQ extension methods available
...
foreach (SubA a in Parent.GetList().OfType<SubA>())
{
...
}
注意a
永遠不會爲空在上面 - 我假設沒關係。
它只是一個簡單的數組,所以它沒有OfType方法。有沒有另一種方法可以爲數組做同樣的事情? –
@PectusExcavatum:數組實現'IEnumerable',所以只要你有'使用System.Linq;'它應該沒問題。 –
謝謝喬恩,那是我的錯誤。謝謝你的幫助;非常感謝:-) –
使用OfType<T>
記錄here。
foreach(SubA a in Parent.GetList().OfType<SubA>())
要獲得特定的實例,可以在數組上使用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);
或者你提供一切條件允許您識別實例。
如果我嘗試使用OFType方法,我得到一個編譯錯誤,因爲System.Array不能控制這個方法 - 我猜我的方法調用GetList()通過你。這只是一個簡單的數組 - 是否有一個等價的方法? –