1

これを行う必要があるのは「デザインの匂い」かもしれませんが、別の質問について考えてみると、これのを実装する最もクリーンな方法は何だろうと思っていました。

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

つまり、特定のインターフェイスを実装していないすべてのオブジェクトを取得/反復する方法は?

おそらく、最高レベルにアップキャストすることから始める必要があります。

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

TODO を解決することで答えます: 最もクリーン/シンプルかつ/または最も効率的な方法で

4

5 に答える 5

6

このようなもの?

foreach (ParentType parentType in collectionOfRelatedObjects) {
    if (!(parentType is ISomethingable)) {
    }
}
于 2008-09-18T04:11:22.240 に答える
3

これでうまくいくはずです:

collectionOfRelatedObjects.Where(o => !(o is ISomethingable))
于 2008-09-18T06:16:43.763 に答える
3

おそらく、最後まで行って変数名を改善するのが最善です。

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

    //do something to/with the not-ISomethingable
}
于 2008-09-18T04:22:34.117 に答える
0

LINQ拡張メソッドOfType<>()の助けを借りて、次のように書くことができます。

using System.Linq;

...

foreach(ISomethingable s in collection.OfType<ISomethingable>())
{
  s.DoSomething();
}
于 2009-06-03T09:44:03.460 に答える
0

JD OConal はこれを行うための最良の方法ですが、補足として、 as キーワードを使用してオブジェクトをキャストできます。その型でない場合は null を返します。

次のようなものです:

foreach (ParentType parentType in collectionOfRelatedObjects) {
    var obj = (parentType as ISomethingable);
    if (obj == null)  {
    }
}
于 2008-09-18T04:23:44.317 に答える