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

时间:2013-01-18 14:16:26

标签: c# abstract-class implementation

我有一些抽象类在我的项目中具有某些UserControls的核心功能。我还有两个单独的实现,都源自Abstract类;我们可以调用它们AbstractImpl1AbstractImpl2.此外,我有几个地方迭代的抽象Collections UserControls

我遇到的问题是InvalidCastExceptions - 我需要遍历实现而不是使用abstact UserControl来获取某些属性(可视化)。除了做try/catch之外,有没有一种干净的方式处理这个问题?

示例:

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

在我的主要表单中,我有ObservableCollection<AbsUserControl> absControlCollection,然后遍历我foreach(AbstractImpl1 userControl in absControlCollection)的项目,以便能够访问视觉方面。问题是ObservableCollection<AbsUserControl> absControlCollection可能由AbstractImpl1AbstractImpl2个对象组成。

有没有一个干净的方法处理这个?现在,我遍历absControlCollection中的对象的每个地方都用try/catch块围绕它,试图遍历AbstractImpl1个对象然后捕获InvalidCastException并继续迭代通过AbstractImpl2个对象。

如果需要更多信息,请与我们联系。谢谢!

3 个答案:

答案 0 :(得分:2)

使用OfType为您进行过滤:

foreach(AbstractImpl1 userControl in
    absControlCollection.OfType<AbstractImpl1>())
{
    ...
}

答案 1 :(得分:2)

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);
    }
}

答案 2 :(得分:0)

您可以使用LINQ的 OfType 方法安全地过滤掉您感兴趣的具体实现。您的foreach将如下所示:

foreach(var userControl in abcControlCollection.OfType<AbstractImpl1>())
{
    /* ... */
}