7

在解决问题

加载 ASP.Net 配置文件时出错

我遇到了我不理解的 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 怎么办?
4

1 回答 1

5

List<T>定义不是mscorelib_HashSet<T>

根据文档

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

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

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

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

于 2012-07-27T05:51:12.143 回答