0

我有一些抽象类,它们具有UserControls我项目中一些的核心功能。我还有两个独立的实现,它们都派生自 Abstract 类;让我们打电话给他们AbstractImpl1AbstractImpl2. 此外,我还有在几个地方迭代 Collections的摘要。UserControls

我遇到的问题是InvalidCastExceptions- 我需要遍历实现而不是抽象的 UserControls 来获得某些属性(视觉)。除了做 a 之外,有没有一种干净的方法来处理这个问题try/catch

例子:

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

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

有没有一种干净的方法来处理这个问题?现在,我遍历对象的每个地方absControlCollection都用一个块包围它try/catch,尝试遍历AbstractImpl1对象然后捕获一个InvalidCastException并继续遍历AbstractImpl2对象。

让我知道是否需要更多信息。谢谢!

4

3 回答 3

2

An alternative to OfType; casting without exceptions:

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);
    }
}
于 2013-01-18T14:24:54.173 回答
2

用于OfType为您进行过滤:

foreach(AbstractImpl1 userControl in
    absControlCollection.OfType<AbstractImpl1>())
{
    ...
}
于 2013-01-18T14:20:55.923 回答
0

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

foreach(var userControl in abcControlCollection.OfType<AbstractImpl1>())
{
    /* ... */
}
于 2013-01-18T14:22:05.790 回答