繁体   English   中英

处理抽象类不同实现的集合的干净方法?

[英]Clean way of dealing with collections of different implementations of Abstract classes?

我有一些Abstract类,这些类具有我项目中某些UserControls的核心功能。 我也有两个单独的实现,都来自Abstract类。 我们称它们为AbstractImpl1AbstractImpl2. 此外,我在多个地方都有抽象UserControls Collections

我遇到的问题是InvalidCastExceptions我需要遍历实现,而不是抽象的UserControls才能访问某些属性(可视化)。 除了进行try/catch之外,还有其他解决方法吗?

例:

在我的项目中,我有Abstract类: AbsUserControl然后有两个单独的实现: AbstractImpl1AbstractImpl2

在我的主要形式中,我具有ObservableCollection<AbsUserControl> absControlCollection ,然后迭代我所做的项foreach(AbstractImpl1 userControl in absControlCollection)以能够访问视觉方面。 问题是ObservableCollection<AbsUserControl> absControlCollection可能由AbstractImpl1AbstractImpl2对象组成。

有没有解决此问题的干净方法? 现在,我遍历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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM