Comment puis-je contourner les paramètres ref ne permettant pas une variation de type?
-
26-09-2019 - |
Question
Disons que j'ai la structure de classe suivante dans ma couche d'accès aux données:
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)
}
}
}
Cela me laisse avoir différentes interfaces que mes modèles peuvent mettre en œuvre et les comportements réutilisables qui gèrent ces interfaces:
interface IUnique { ... }
class UniqueBehavior : IBehavior<IUnique> { ... }
interface ITimestampable { ... }
class TimestampableBehavior : IBehavior<ITimestampable> { ... }
Et le gestionnaire prendra plaisir à cause de ces contravariance dans IBehavior<T>
.
class MyModel : IUnique, ITimestampable { ... }
new ModelManager<MyModel>(new IBehavior<MyModel>[] {
new UniqueBehavior(),
new TimestampableBehavior()
});
Super.
Mais maintenant, je veux que chaque comportement appliquer un ensemble de filtres LINQ à l'entité aussi. Ma première idée était d'ajouter cette méthode pour IBehavior<T>
:
void ApplyFilters<IEnumerable>(ref IEnumerable<T> models)
... dans laquelle un comportement mise en œuvre s'appliquerait un ensemble de clauses de Where
à l'énumération à sa discrétion.
Cependant, il se trouve, paramètres ref ne permettent pas variation de type. J'ai du mal à trouver un moyen de mettre en œuvre ce type de fonctionnalité tout en maintenant à la fois la sécurité de type et la nature contravariante de l'interface. Toutes les idées sont appréciés.
La solution
Je ne sais pas si cela fonctionnerait dans votre contexte exact, mais avez-vous essayé de faire lui-même générique ApplyFolders?
void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T;
Autres conseils
Je prendrais un coup d'œil à la Ptr de classe. J'ai pris avantage de cette classe récemment complètement buste toutes les limitations .NET met des mots-clés ref pour me laisser des effets secondaires des objets CLR pour une raison quelconque sent je n'ai pas le droit.