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

可能最好一路改进变量名:

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

    //do something to/with the not-ISomethingable
}
于 2008-09-18T04:22:34.117 回答
3

这应该可以解决问题:

collectionOfRelatedObjects.Where(o => !(o is ISomethingable))
于 2008-09-18T06:16:43.763 回答
0

JD OConal 是执行此操作的最佳方法,但作为旁注,您可以使用 as 关键字来强制转换对象,如果它不是该类型,它将返回 null。

所以像:

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

在 LINQ 扩展方法 OfType<>() 的帮助下,您可以编写:

using System.Linq;

...

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