2008-09-18 67 views
1

也許需要做到這一點是'設計氣味',但考慮另一個問題,我想知道最簡單的方法來實現這種逆找出(upcast)實例是否沒有實現特定接口的最佳方法

foreach(ISomethingable somethingableClass in collectionOfRelatedObjects) 
{ 
    somethingableClass.DoSomething(); 
} 

即如何獲得通過實現特定接口的所有對象/循環?

想必你需要通過向上轉型來的最高水平開始:

foreach(ParentType parentType in collectionOfRelatedObjects) 
{ 
    // TODO: iterate through everything which *doesn't* implement ISomethingable 
} 

回答解決TODO:在乾淨/簡單的和/或最有效的方式

回答

3

這應該做的伎倆:

collectionOfRelatedObjects.Where(o => !(o is ISomethingable)) 
+0

不錯。這些新方法我沒有做太多。 – 2008-09-18 07:08:10

6

像這樣的事情?

foreach (ParentType parentType in collectionOfRelatedObjects) { 
    if (!(parentType is ISomethingable)) { 
    } 
} 
3

可能是最好的一路走下去,提高了變量名:

foreach (object obj in collectionOfRelatedObjects) 
{ 
    if (obj is ISomethingable) continue; 

    //do something to/with the not-ISomethingable 
} 
0

JD OConal的是做到這一點的最佳方式,但作爲一個側面說明,您可以使用作爲關鍵字來投一個對象,如果它不是那種類型,它將返回null。

因此,像:

foreach (ParentType parentType in collectionOfRelatedObjects) { 
    var obj = (parentType as ISomethingable); 
    if (obj == null) { 
    } 
} 
0

與LINQ的擴展方法有些幫助OfType <>(),你可以這樣寫:

using System.Linq; 

... 

foreach(ISomethingable s in collection.OfType<ISomethingable>()) 
{ 
    s.DoSomething(); 
} 
相關問題