我有一个快速问题。从抽象类型对象数组访问特定子类的对象
我有几个类,说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()通过你。这只是一个简单的数组 - 是否有一个等价的方法? –