Используйте Enumerable.OfType
для извлечения только тех элементов Items
, которые реализуют IDrawableItem
:
foreach(var item in Items.OfType<IDrawableItem>()) {
item.Draw();
}
Чтобы ответить на вопрос, заданный Nanook в комментариях, приведенный выше код, вероятно, будет переведен в код, эквивалентный следующему:
foreach(var item in Items) {
if(item is IDrawableItem) {
((IDrawable)item).Draw();
}
}
Конечно, действительно есть итератор за кулисами, который выглядит примерно так:
public static IEnumerable<T> OfType<T>(this IEnumerable<TSource> source) {
if(source == null) {
throw new ArgumentNullException("source");
}
foreach(TSource item in source) {
if(item is T) {
yield return (T)item;
}
}
}
Итак, это показывает, что мы, вероятно, повторяем только Items
один раз. Конечно, не требуется, чтобы OfType
был реализован, как указано выше, но это разумная вещь.