【发布时间】:2010-12-16 15:24:46
【问题描述】:
最近我注意到泛型构造类型可以打开和关闭。但我不明白它们的真正含义。能举个简单的例子吗?
【问题讨论】:
最近我注意到泛型构造类型可以打开和关闭。但我不明白它们的真正含义。能举个简单的例子吗?
【问题讨论】:
在实践中,术语并不重要 - 我不记得上次我在尝试写它时不得不担心它除了。
(嵌套类型还有更多规则。有关详细信息,请参阅 C# 3.0 规范第 4.4 节。)
作为一个开放构造类型的例子,考虑:
public class NameDictionary<T> : Dictionary<string, T>
typeof(NameDictionary<>) 的基类是:
T) 是打开类型Type.IsGenericType 的 MSDN 文档有一个非常有用的小表格。
重申一下,这在日常使用中几乎完全不重要。
我通常赞成了解正确的术语 - 特别是对于诸如“通过引用传递”等的东西 - 但在这种情况下,它真的,真的不会经常出现。我想积极劝阻你不要担心它:)
【讨论】:
我在依赖注入映射中主要使用开放泛型(基本上未实例化的泛型)。例如,像
Bind<IRepository<>>()
.To<BasicRepository<>>()
然后,当我的对象构造函数包含:
public SomethingController(IRepository<Something>) { ... }
我的依赖注入机制将自动实例化一个 BasicRepository
【讨论】:
Autofac 也支持开放的泛型类型:Autofac - creating components
来自MSDN:
如果可实例化类型已替换其所有类型参数,包括所有封闭类型的所有类型参数,则泛型类型或方法将关闭。如果它是封闭的,你只能创建一个泛型类型的实例。
所以这是因为List<int> 已关闭:
var list = Activator.CreateInstance(typeof(List<int>));
但这会在运行时引发异常,因为List<> 是open:
var list = Activator.CreateInstance(typeof(List<>));
↑
【讨论】: