0

プロジェクトのいくつかのコア機能を持ついくつかの抽象クラスがありますUserControls。また、Abstractクラスから派生した2つの別個の実装があります。AbstractImpl1それらを呼び出しましょうAbstractImpl2. 。さらに、私はいくつかの場所で繰り返す Collections要約を持っています。UserControls

私が抱えている問題はInvalidCastExceptions、特定のプロパティ(ビジュアル)に到達するために、abstact UserControlsではなく、実装を反復処理する必要があることです。を行う以外にこれに対処するためのクリーンな方法はありtry/catchますか?

例:

私のプロジェクトには抽象クラスがあります:AbsUserControl それから私はそれらの2つの別々の実装を持っています:AbstractImpl1そしてAbstractImpl2

私のメインフォームでは、視覚的な側面にアクセスできるようにするために、ObservableCollection<AbsUserControl> absControlCollectionアイテムを繰り返し処理しています。foreach(AbstractImpl1 userControl in absControlCollection)問題は、またはオブジェクトObservableCollection<AbsUserControl> absControlCollectionで構成されている可能性があることです。AbstractImpl1AbstractImpl2

これに対処するためのクリーンな方法はありますか?現在、オブジェクトを反復処理するすべての場所をブロックでabsControlCollection囲み、オブジェクトを反復処理してからキャッチし、オブジェクトを反復処理します。try/catchAbstractImpl1InvalidCastExceptionAbstractImpl2

さらに情報が必要な場合はお知らせください。ありがとう!

4

3 に答える 3

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);
    }
}
于 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 に答える