2013-09-30 253 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); 

或者你提供一切条件允许您识别实例。