Type.GetType(),HashSet <t>和程序集限定</t>

时间:2012-07-27 05:36:40

标签: .net

解决问题

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运行时为3.5(第一个具有HashSet<T>)或后者如.NET 4.5,该怎么办?如果运行时完全像Silverlight或Mono那样呢?

1 个答案:

答案 0 :(得分:5)

List<T> mscorelib HashSet<T> GetType definedis not

根据documentation

  

如果类型在当前正在执行的程序集中或在Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了

关于第二个问题,如果为当前框架/配置文件中不可用的程序集提供限定类型名称,{{1}}将返回null。

需要所有程序集属性的原因在Type.GetType文档中指定(正如Jason Malinowski在评论中指出的那样):

  

如果typeName包含命名空间而不包含程序集名称,则此方法仅按顺序搜索调用对象的程序集和Mscorlib.dll。如果typeName完全使用部分或完整程序集名称限定,则此方法将在指定的程序集中搜索。 如果程序集具有强名称,则需要完整的程序集名称。