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图书馆;我不确定其他框架)。