.net Type.GetType(),HashSet<;T>;和装配鉴定

.net Type.GetType(),HashSet<;T>;和装配鉴定,.net,.net,在解决问题时 我遇到了我不理解的Type.GetType(string typeName)的行为 获取列表的类型时,将类型指定为就足够了 System.Collections.Generic.List`1[[System.Int32]] 但是,对于HashSet,我必须指定一个完全限定的类型名,如下所示 System.Collections.Generic.HashSet`1[[System.Int32]],System.Core,版本=4.0.0.0,区域性=neutral,PublicKe

在解决问题时

我遇到了我不理解的Type.GetType(string typeName)的行为

获取
列表的类型时,将类型指定为就足够了

System.Collections.Generic.List`1[[System.Int32]]

但是,对于
HashSet
,我必须指定一个完全限定的类型名,如下所示

System.Collections.Generic.HashSet`1[[System.Int32]],System.Core,版本=4.0.0.0,区域性=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");
问题

  • 为什么我必须完全限定
    哈希集
    ,而不是
    列表
  • 鉴于必须指定版本限定,如果.NET运行时是3.5(第一个具有
    HashSet
    )或更高版本(如.NET 4.5),该怎么办?如果运行时是完全类似Silverlight或Mono的其他东西呢
  • 列表
    位于
    mscorelib
    HashSet

    根据:

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

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

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

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


    是的,但仅凭装配进行资格认证不起作用。我必须使用程序集、版本、区域性和公钥标记进行限定。程序集的完整“名称”包括版本、区域性等属性。@Jason:在进一步阅读文档之后,类型的程序集限定名称由类型名称(包括其命名空间)和逗号组成,后跟程序集的显示名称。没有提到文化等是必要的埃里克是对的。根据,仅程序集名称就足够了。不幸的是,我不知道为什么它在这里不起作用。在阅读Type.GetType(string)的文档时,它指出:“如果typeName使用部分或完整的程序集名称完全限定,则此方法在指定的程序集中搜索。如果程序集具有强名称,则需要完整的程序集名称。”System.Core.dll将有一个强名称,因此无论发生什么情况,可能这个规则都适用。这也应该有效(尽管我没有尝试):
    System.Collections.Generic.HashSet
    1[[System.Int32]],System.Core`@Andrey:这也是我的期望,但不起作用。这可能与此相关:我很快在F#Interactive中尝试了短版本(工作),以及PowerShell和Roslyn(不工作).F#Interactive为我提供了到“C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Core.dll”的
    绑定会话…
    。由于它显然不解析字符串,所以我使用了一些反射器,正如预期的那样,它安装了自定义的
    AppDomain.CurrentDomain.AssemblyResolve
    。因此,如果使用允许较短名称的自定义程序集解析程序。