Возможно, необходимость сделать это - это «запах дизайна», но, думая о другом вопросе, мне было интересно, какой самый чистый способ реализовать обратный этого:
foreach(ISomethingable somethingableClass in collectionOfRelatedObjects)
{
somethingableClass.DoSomething();
}
т.е. как получить / перебрать все объекты, которые не реализуют конкретный интерфейс?
Предположительно, вам нужно будет начать с повышения до самого высокого уровня:
foreach(ParentType parentType in collectionOfRelatedObjects)
{
// TODO: iterate through everything which *doesn't* implement ISomethingable
}
Ответьте, решив TODO: самым чистым / простым и / или наиболее эффективным способом





Что-то вроде этого?
foreach (ParentType parentType in collectionOfRelatedObjects) {
if (!(parentType is ISomethingable)) {
}
}
Вероятно, лучше всего пойти дальше и улучшить имена переменных:
foreach (object obj in collectionOfRelatedObjects)
{
if (obj is ISomethingable) continue;
//do something to/with the not-ISomethingable
}
J D OConal - лучший способ сделать это, но в качестве примечания вы можете использовать ключевое слово as для приведения объекта, и он вернет null, если он не этого типа.
Так что-то вроде:
foreach (ParentType parentType in collectionOfRelatedObjects) {
var obj = (parentType as ISomethingable);
if (obj == null) {
}
}
это должно сработать:
collectionOfRelatedObjects.Where(o => !(o is ISomethingable))
С некоторой помощью метода расширения LINQ OfType <> () вы можете написать:
using System.Linq;
...
foreach(ISomethingable s in collection.OfType<ISomethingable>())
{
s.DoSomething();
}