在解决问题
我遇到了我不理解的 Type.GetType(string typeName) 行为。
获取 a 的类型时,将List<int>
类型指定为
System.Collections.Generic.List`1[[System.Int32]]
但是,对于HashSet<int>
,我必须像这样指定一个完全限定的类型名称
System.Collections.Generic.HashSet`1[[System.Int32]],System.Core,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089
如果我遗漏了任何程序集、版本、文化或公钥标记,则不会解析该类型。
重现代码
// Returns expected type:
Type tListWorks =
Type.GetType("System.Collections.Generic.List`1[[System.Int32]]");
// Returns null:
Type tHashSetNull =
Type.GetType("System.Collections.Generic.HashSet`1[[System.Int32]]");
// Returns expected type:
Type tHashSetWorks =
Type.GetType("System.Collections.Generic.HashSet`1[[System.Int32]], System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
// Returns null (omitted Culture):
Type tHashSetNoCultureFails =
Type.GetType("System.Collections.Generic.HashSet`1[[System.Int32]], System.Core, Version=4.0.0.0, PublicKeyToken=b77a5c561934e089");
问题
- 为什么我必须完全符合资格
HashSet<T>
而不是List<T>
? - 鉴于必须指定版本限定,如果 .NET 运行时是 3.5(第一个具有
HashSet<T>
.NET 的)或更高版本(例如 .NET 4.5)怎么办?如果运行时完全像 Silverlight 或 Mono 怎么办?