最近我注意到通用构造类型可以是开放和关闭的。但我不明白它们实际上意味着什么。你能给一个简单的例子吗?
(对于嵌套类型还有进一步的规则。请参阅C# 3.0规范第4.4节以获取详细信息。)
作为开放构造类型的示例,请考虑:
public class NameDictionary<T> : Dictionary<string, T>
typeof(NameDictionary<>)
的基类是:
T
) 是一个开放类型Type.IsGenericType
的 MSDN 文档有一个非常有用的表格。来自MSDN:
如果可实例化类型已替换为其所有类型参数,包括所有封闭类型的所有类型参数,则泛型类型或方法将关闭。 只有在关闭泛型类型时才能创建其实例。
因此,这个例子中的List<int>
是关闭的:
var list = Activator.CreateInstance(typeof(List<int>));
但是运行时会抛出异常,因为 List<>
是开放的:
var list = Activator.CreateInstance(typeof(List<>));
↑
我在依赖注入映射中主要使用了开放式泛型(即未实例化的泛型)。例如,像这样的东西:
Bind<IRepository<>>()
.To<BasicRepository<>>()
接下来,当我的对象构造函数包含:
public SomethingController(IRepository<Something>) { ... }
我的依赖注入机制会自动实例化一个 BasicRepository< Something >。(这适用于 Ninject 和 StructureMap,可能也适用于 Castle Windsor 库;其他框架我不确定)。
List<>
和List<int>
之间的关系?后者是前者的封闭子类型吗?还是封闭版本?或者是封闭类型? - Ethan Reesor