Как я могу получить параметры Ref, не позволяя вводить вариации?

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

Вопрос

Позвольте сказать, что у меня есть следующая структура классов в моем слое доступа к данным:

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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top