Il modo migliore per scoprire se un'istanza (upcast) non implementa una particolare interfaccia
Domanda
Forse la necessità di farlo è un "odore di design", ma pensando a un'altra domanda, mi chiedevo quale fosse il modo più pulito per implementare il inverso di questo:
foreach(ISomethingable somethingableClass in collectionOfRelatedObjects)
{
somethingableClass.DoSomething();
}
cioè.Come ottenere/iterare tutti gli oggetti that non implementare un'interfaccia particolare?
Presumibilmente dovresti iniziare eseguendo l'upcast al livello più alto:
foreach(ParentType parentType in collectionOfRelatedObjects)
{
// TODO: iterate through everything which *doesn't* implement ISomethingable
}
Rispondi risolvendo la TODO:nel modo più pulito/semplice e/o più efficiente
Soluzione
questo dovrebbe fare al caso tuo:
collectionOfRelatedObjects.Where(o => !(o is ISomethingable))
Altri suggerimenti
Qualcosa come questo?
foreach (ParentType parentType in collectionOfRelatedObjects) {
if (!(parentType is ISomethingable)) {
}
}
Probabilmente è meglio andare fino in fondo e migliorare i nomi delle variabili:
foreach (object obj in collectionOfRelatedObjects)
{
if (obj is ISomethingable) continue;
//do something to/with the not-ISomethingable
}
J D OConal è il modo migliore per farlo, ma come nota a margine, puoi usare la parola chiave as per lanciare un oggetto e restituirà null se non è di quel tipo.
Quindi qualcosa del tipo:
foreach (ParentType parentType in collectionOfRelatedObjects) {
var obj = (parentType as ISomethingable);
if (obj == null) {
}
}
Con l'aiuto del metodo di estensione LINQ OfType<>(), puoi scrivere:
using System.Linq;
...
foreach(ISomethingable s in collection.OfType<ISomethingable>())
{
s.DoSomething();
}