[英]Clean way of dealing with collections of different implementations of Abstract classes?
我有一些Abstract类,这些类具有我项目中某些UserControls
的核心功能。 我也有两个单独的实现,都来自Abstract类。 我们称它们为AbstractImpl1
和AbstractImpl2.
此外,我在多个地方都有抽象UserControls
Collections
。
我遇到的问题是InvalidCastExceptions
我需要遍历实现,而不是抽象的UserControls才能访问某些属性(可视化)。 除了进行try/catch
之外,还有其他解决方法吗?
例:
在我的项目中,我有Abstract类: AbsUserControl
然后有两个单独的实现: AbstractImpl1
和AbstractImpl2
在我的主要形式中,我具有ObservableCollection<AbsUserControl> absControlCollection
,然后迭代我所做的项foreach(AbstractImpl1 userControl in absControlCollection)
以能够访问视觉方面。 问题是ObservableCollection<AbsUserControl> absControlCollection
可能由AbstractImpl1
或AbstractImpl2
对象组成。
有没有解决此问题的干净方法? 现在,我遍历absControlCollection
对象的每个地方都用try/catch
块将其包围,尝试遍历AbstractImpl1
对象,然后捕获InvalidCastException
并继续遍历AbstractImpl2
对象。
让我知道是否需要更多信息。 谢谢!
使用OfType
为您进行过滤:
foreach(AbstractImpl1 userControl in
absControlCollection.OfType<AbstractImpl1>())
{
...
}
OfType
的替代方法; 投放无例外:
foreach(AbsUserControl control in absControlCollection)
{
if(control is AbstractImpl1)
{
AbstractImpl1 i1 = (AbstractImpl1)control;
DoStuff(i1);
}
if(control is AbstractImpl2)
{
AbstractImpl2 i2 = (AbstractImpl2)control;
DoOtherStuff(i2);
}
}
您可以使用LINQ的OfType
方法来安全地仅过滤出您感兴趣的具体实现。然后,您的foreach
如下所示:
foreach(var userControl in abcControlCollection.OfType<AbstractImpl1>())
{
/* ... */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.