2013-01-18 72 views
0

我有幾個抽象類,在我的項目中有一些UserControls的核心功能。我也有兩個派生自Abstract類的獨立實現;我們打電話給他們AbstractImpl1AbstractImpl2.另外,我有Collections的摘要UserControls,我在幾個地方迭代。處理抽象類的不同實現的集合的乾淨方式?

我遇到的問題是InvalidCastExceptions - 我需要遍歷實現而不是抽象UserControls來獲取某些屬性(可視化)。除了做一個try/catch之外,有沒有一種乾淨的方式來處理這個問題?

例子:

在我的項目我有抽象類:AbsUserControl 然後我讓他們兩個單獨的實現:AbstractImpl1AbstractImpl2

在我的主要形式,我有ObservableCollection<AbsUserControl> absControlCollection然後通過項目迭代我做foreach(AbstractImpl1 userControl in absControlCollection)能夠訪問視覺方面。問題是ObservableCollection<AbsUserControl> absControlCollection可能由AbstractImpl1AbstractImpl2對象組成。

有沒有一個乾淨的方式來處理這個問題?現在,我遍歷absControlCollection中的對象的每個地方都用try/catch塊圍繞它,嘗試遍歷AbstractImpl1對象,然後捕獲InvalidCastException並繼續遍歷AbstractImpl2對象。

讓我知道是否需要更多信息。謝謝!

+0

你的意思是集合是_all_'Impl1'或_all_' Impl2',從來沒有混合? – Rawling

+0

@Rawling現在的集合可以是'Impl1'或'Impl2',但有可能我希望以後在 – Saggio

回答

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

謝謝!儘管Rawling的答案是「更清晰」,但它實際上更符合我的需求 - 「foreach()」循環中的很多邏輯在兩個實現之間是很常見的,所以我更加有意識的檢查它在哪個實現中'foreach()',做特定的邏輯,然後繼續使用公共邏輯,而不是有一個單獨的'foreach()'循環,這會迫使我重複邏輯。 – Saggio

2

使用OfType做過濾爲您提供:

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

上有混合集合謝謝!這是一個非常乾淨的實現,但@ SebastianNegraszus的解決方案實際上更好地滿足了我的特定需求 – Saggio

+0

是的,我可能會自己去找他的解決方案:p – Rawling

0

您可以使用LINQ的OfType方法安全地過濾出的具體落實,你有興趣在你的foreach會再看看這樣的:。

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