Как я могу обойти параметры ref, не допускающие изменения типа? - PullRequest
1 голос
/ 06 января 2011

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

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 не допускают изменения типа .Я изо всех сил пытаюсь найти способ реализовать такую ​​функциональность, сохраняя при этом безопасность типов и противоречивую природу интерфейса.Любые идеи приветствуются.

Ответы [ 2 ]

1 голос
/ 06 января 2011

Я бы взглянул на Ptr класс . Недавно я воспользовался этим классом, чтобы полностью снять все ограничения .NET ставит ключевые слова ref, чтобы позволить мне побочные эффекты, которые CLR по какой-то причине чувствует, что я не имею права.

1 голос
/ 06 января 2011

Не уверен, что это будет работать в вашем конкретном контексте, но вы пытались сделать ApplyFolders универсальным?

void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...