在解决问题“Error Loading ASP.Net Profile”时,我遇到了一个我不理解的Type.GetType(string typeName)行为。
当获取List<int>类型时,仅指定类型为
System.Collections.Generic.List`1[[System.Int32]]
是足够的。然而,对于HashSet<int>,我必须像这样指定完全限定的类型名称:
System.Collections.Generic.HashSet`1[[System.Int32]], System.Core, Version=4.0.0.0, Culture=neutral, 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 Runtime是3.5(第一个支持
HashSet<T>
的版本),或者更高版本如.NET 4.5,那该怎么办?如果运行时是其他完全不同的平台,比如Silverlight或Mono呢?
System.Collections.Generic.HashSet
1[[System.Int32]], System.Core`。 - Andrey ShchekinBinding session to 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Core.dll'...
。由于它显然无法解析字符串,我使用了一些反射器,并且如预期的那样,它安装了自定义的AppDomain.CurrentDomain.AssemblyResolve
。因此,如果您使用允许较短名称的自定义程序集解析器,则应该可以指定较短的名称。 - Andrey Shchekin