如何避免参数参数不允许类型变化?

比方说,我有我的数据访问层中的以下类结构:

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参数不允许类型变化。 我努力寻找一种方法来实现这种功能,同时保持类型安全和接口的逆变性质。 任何想法都表示赞赏。


不知道这是否会在你的确切环境下工作,但你有没有尝试使ApplyFolders泛型?

void ApplyFolders<TEnum>(ref IEnumerable<TEnum> models) where TEnum : T;

我会看看Ptr类。 最近我一直在利用这个类来彻底地破解.NET放入ref关键字的所有限制,让我对CLR出于某种原因感觉我没有权利使用副作用对象。

链接地址: http://www.djcxy.com/p/39431.html

上一篇: How can I get around ref parameters not allowing type variation?

下一篇: Multiple Inheritance in C#