Как я могу получить параметры Ref, не позволяя вводить вариации?
-
26-09-2019 - |
Вопрос
Позвольте сказать, что у меня есть следующая структура классов в моем слое доступа к данным:
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()
});
Супер.
Но теперь я хочу позволить каждому поведению применить набор фильтров LINQ к объекту. Моя первая идея состояла в том, чтобы добавить этот метод IBehavior<T>
:
void ApplyFilters<IEnumerable>(ref IEnumerable<T> models)
... в котором реализующее поведение будет применять набор Where
пункты для перечисления по своему усмотрению.
Однако, как оказывается, Параметры Ref не позволяют вариации типа. Отказ Я изо всех сил пытаюсь найти способ реализации такого типа функциональности при сохранении как безопасности типа, так и контравариантной природы интерфейса. Любые идеи ценятся.
Решение
Не уверен, будет ли это работать в вашем точнее контексте, но вы пытались сделать настроенными шпаргалками Generic?
void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T;
Другие советы
Я бы посмотрел на Класс PTR.. Отказ В последнее время я пользуюсь этим классом недавно, чтобы полностью перебросить все ограничения .NET .NET.