最近我注意到泛型构造类型可以是开放的和封闭的。但我不明白它们的真正含义。能举个简单的例子吗
实际上,术语并不重要——我不记得上次我不得不担心它是什么时候了除了当我试图写它的时候。
(嵌套类型还有更多规则。有关详细信息,请参阅 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<>
是 open:
var list = Activator.CreateInstance(typeof(List<>));
↑
我在依赖注入映射中主要使用开放泛型(基本上是未实例化的泛型)。例如,类似
Bind<IRepository<>>()
.To<BasicRepository<>>()
然后,当我的对象构造函数包含:
public SomethingController(IRepository<Something>) { ... }
我的依赖注入机制将自动实例化一个 BasicRepository< Something >。 (这适用于 Ninject 和 StructureMap,可能还有 Castle Windsor 库;我不确定其他框架)。