Лучший способ выяснить, если экземпляр (upcast) не реализует определенный интерфейс - PullRequest
1 голос
/ 18 сентября 2008

Может быть, необходимость сделать это - «запах дизайна», но, подумав о другом вопросе, мне было интересно, какой самый чистый способ реализовать обратное из этого:

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

т.е. Как получить / перебрать все объекты, которые не реализуют определенный интерфейс?

Предположительно, вам нужно начать с апгрейда до самого высокого уровня:

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

Ответ, решив ТОДО: самым чистым / простым и / или наиболее эффективным способом

Ответы [ 5 ]

6 голосов
/ 18 сентября 2008

Как то так?

foreach (ParentType parentType in collectionOfRelatedObjects) {
    if (!(parentType is ISomethingable)) {
    }
}
3 голосов
/ 18 сентября 2008

это должно сработать:

collectionOfRelatedObjects.Where(o => !(o is ISomethingable))
3 голосов
/ 18 сентября 2008

Вероятно, лучше всего пройти весь путь и улучшить имена переменных:

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

    //do something to/with the not-ISomethingable
}
0 голосов
/ 03 июня 2009

С помощью метода расширения LINQ OfType <> () вы можете написать:

using System.Linq;

...

foreach(ISomethingable s in collection.OfType<ISomethingable>())
{
  s.DoSomething();
}
0 голосов
/ 18 сентября 2008

J D OConal's - лучший способ сделать это, но в качестве примечания вы можете использовать ключевое слово as для приведения объекта, и он вернет null, если он не относится к этому типу.

Так что-то вроде:

foreach (ParentType parentType in collectionOfRelatedObjects) {
    var obj = (parentType as ISomethingable);
    if (obj == null)  {
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...