Il modo migliore per scoprire se un'istanza (upcast) non implementa una particolare interfaccia

StackOverflow https://stackoverflow.com/questions/89897

  •  01-07-2019
  •  | 
  •  

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

È stato utile?

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top