解决问题
我遇到了我不理解的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>
?HashSet<T>
)或后者如.NET 4.5,该怎么办?如果运行时完全像Silverlight或Mono那样呢?答案 0 :(得分:5)
List<T>
mscorelib
HashSet<T>
GetType
defined为is not。
如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了
关于第二个问题,如果为当前框架/配置文件中不可用的程序集提供限定类型名称,{{1}}将返回null。
需要所有程序集属性的原因在Type.GetType文档中指定(正如Jason Malinowski在评论中指出的那样):
如果typeName包含命名空间而不包含程序集名称,则此方法仅按顺序搜索调用对象的程序集和Mscorlib.dll。如果typeName完全使用部分或完整程序集名称限定,则此方法将在指定的程序集中搜索。 如果程序集具有强名称,则需要完整的程序集名称。