Допустим, у меня есть следующая структура классов в моем уровне доступа к данным:
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)
}
}
}
Это позволяет мне иметь различные интерфейсы, которые могут реализовывать мои модели, и многократно используемые поведения, которые обрабатывают эти интерфейсы:
interface IUnique { ... }
class UniqueBehavior : IBehavior<IUnique> { ... }
interface ITimestampable { ... }
class TimestampableBehavior : IBehavior<ITimestampable> { ... }
И менеджер с радостью примет их из-за контравариантности в IBehavior<T>
.
class MyModel : IUnique, ITimestampable { ... }
new ModelManager<MyModel>(new IBehavior<MyModel>[] {
new UniqueBehavior(),
new TimestampableBehavior()
});
Super.
Но теперь я хочу позволить каждому поведению применить наборLINQ фильтрует и по сущности.Моя первая идея состояла в том, чтобы добавить этот метод к IBehavior<T>
:
void ApplyFilters<IEnumerable>(ref IEnumerable<T> models)
..., в котором поведение реализации будет применять набор предложений Where
к перечислению по своему усмотрению.
Однако, как выясняется, параметры ref не допускают изменения типа .Я изо всех сил пытаюсь найти способ реализовать такую функциональность, сохраняя при этом безопасность типов и противоречивую природу интерфейса.Любые идеи приветствуются.