Domanda

Diciamo che ho la seguente struttura di classe nel mio livello di accesso ai dati:

interface IBehavior<in T>
{
  void Load(T model);
}

class ModelManager<T>
{
  ModelManager(IEnumerable<IBehavior<T>> behaviors) { ... }

  void Load(T model)
  {
    foreach (var behavior in behaviors) {
      behavior.Load(model)
    }
  }
}

Questo mi permette di avere varie interfacce che i miei modelli possono implementare e comportamenti riutilizzabili che gestiscono queste interfacce:

interface IUnique { ... }
class UniqueBehavior : IBehavior<IUnique>  { ... }

interface ITimestampable  { ... }
class TimestampableBehavior : IBehavior<ITimestampable> { ... }

E il direttore sarà lieto di prendere questi a causa della controvarianza in IBehavior<T>.

class MyModel : IUnique, ITimestampable { ... }

new ModelManager<MyModel>(new IBehavior<MyModel>[] {
  new UniqueBehavior(),
  new TimestampableBehavior()
});

Super.

Ma ora, voglio lasciare che ogni comportamento applicare una serie di filtri per l'entità LINQ troppo. La mia prima idea era di aggiungere questo metodo per IBehavior<T>:

void ApplyFilters<IEnumerable>(ref IEnumerable<T> models)

... in cui un comportamento implementazione si applicherebbe un insieme di clausole Where per l'enumerazione a sua discrezione.

Tuttavia, come si è visto, parametri ref non permettono il tipo di variazione . Sto lottando per trovare un modo per implementare questo tipo di funzionalità, pur mantenendo sia la sicurezza tipo e la natura controvariante dell'interfaccia. Tutte le idee sono apprezzati.

È stato utile?

Soluzione

Non sono sicuro se questo dovrebbe funzionare nel vostro contesto esatto, ma hai provato a fare ApplyFolders sé generica?

void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T;

Altri suggerimenti

Vorrei dare un'occhiata al Ptr classe . Ho preso vantaggio di questa classe di recente completamente busto tutte le limitazioni .NET mette su parole chiave ref per farmi effetto collaterale oggetti CLR per qualche motivo si sente non ho il diritto di.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top