找出(upcast)实例是否未实现特定接口的最佳方法

时间:2008-09-18 04:02:21

标签: c# .net interface

也许需要这样做是一种'设计气味',但想到另一个问题,我想知道实现的最简洁方法是什么:

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

即。如何获取/遍历实现特定接口的所有对象?

据推测,你需要从向上升到最高级别开始:

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

通过解决TODO回答:以最干净/最简单和/或最有效的方式

5 个答案:

答案 0 :(得分:6)

这样的东西?

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

答案 1 :(得分:3)

可能最好一路走下去并改进变量名称:

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

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

答案 2 :(得分:3)

这应该可以解决问题:

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

答案 3 :(得分:0)

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

类似于:

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

答案 4 :(得分:0)

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

using System.Linq;

...

foreach(ISomethingable s in collection.OfType<ISomethingable>())
{
  s.DoSomething();
}