如何避免参数参数不允许类型变化?
比方说,我有我的数据访问层中的以下类结构:
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?