generics – Open和Closed构造types
最近我注意到通用构造types可以打开和closures。 但我不明白他们究竟是什么意思。 你能举一个简单的例子吗?
在实践中,术语并不重要 – 我不记得最后一次除了写这些东西之外 ,我不得不担心它。
- 未绑定types没有指定types参数
- 构造types至less指定了一个types参数
- types参数是一个开放types
- 元素types打开的数组types是开放types
- 一个打开的构造types至less有一个types参数是一个开放types
- 封闭式是指任何不开放的types
(嵌套types有更多规则,请参阅C#3.0规范第4.4节了解更多信息。)
作为一个开放式的例子,考虑:
public class NameDictionary<T> : Dictionary<string, T>
typeof(NameDictionary<>)
的基类是:
- 构造因为它指定types参数
- 打开,因为第二个types参数(
T
)是一个开放的types
Type.IsGenericType
的MSDN文档有一个相当有用的小表。
只是重申,这在日常使用中几乎完全不重要。
我通常赞成知道正确的术语 – 特别是像“通过引用”等等 – 但在这种情况下,它确实不是经常出现。 我想积极劝阻你不要担心:)
来自MSDN :
如果可实例化types已被所有types参数(包括所有包含types的所有types参数)替代,则genericstypes或方法将被closures。 只有在closures的情况下才能创buildgenericstypes的实例。
所以这个工作就像List<int>
是closures的 :
var list = Activator.CreateInstance(typeof(List<int>));
但是这会在运行时抛出一个exception,因为List<>
是打开的 :
var list = Activator.CreateInstance(typeof(List<>)); ↑
我主要在dependency injection映射中使用了开放generics(基本上没有实例化的generics)。 例如,类似的东西
Bind<IRepository<>>() .To<BasicRepository<>>()
然后,当我的对象构造函数包含:
public SomethingController(IRepository<Something>) { ... }
我的dependency injection机制将自动实例化BasicRepository <Something>。 (这适用于Ninject和StructureMap,也可能是Castle Windsor图书馆;我不确定其他框架)。