最近我注意到通用构造类型可以打开和关闭。但我不明白他们究竟是什么意思。你能给出一个简单的例子吗?
答案 0 :(得分:64)
在实践中,术语并不重要 - 我记不起上次我不得不担心除了在试图写它时。
(嵌套类型还有其他规则。有关血淋淋的详细信息,请参阅C#3.0规范第4.4节。)
作为开放构造类型的示例,请考虑:
public class NameDictionary<T> : Dictionary<string, T>
typeof(NameDictionary<>)
的基类是:
T
)是开放式 Type.IsGenericType
的MSDN文档有一个非常有用的小表。
重申一下,这在日常使用中几乎完全不重要。
我一般都赞成知道正确的术语 - 特别是对于“通过参考传递”等等 - 但在这种情况下,它确实不会经常出现。我想积极劝阻你不要担心:)
答案 1 :(得分:7)
来自MSDN:
如果可实例化类型已替换其所有类型参数(包括所有封闭类型的所有类型参数),则关闭泛型类型或方法。如果关闭,则只能创建泛型类型的实例。
因此List<int>
已关闭:
var list = Activator.CreateInstance(typeof(List<int>));
但是这会在运行时抛出异常,因为List<>
打开:
var list = Activator.CreateInstance(typeof(List<>));
↑
答案 2 :(得分:3)
我主要在依赖注入映射中使用开放泛型(基本上是未实例化的泛型)。例如,像
Bind<IRepository<>>()
.To<BasicRepository<>>()
然后,当我的对象构造函数包含:
时public SomethingController(IRepository<Something>) { ... }
我的依赖注入机制将实例化一个BasicRepository&lt;什么&gt;自动的。 (这适用于Ninject和StructureMap,可能还有Castle Windsor库;我不确定其他框架。)