.net Type.GetType(),HashSet<;T>;和装配鉴定
在解决问题时 我遇到了我不理解的Type.GetType(string typeName)的行为 获取.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
列表的类型时,将类型指定为就足够了
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
。因此,如果使用允许较短名称的自定义程序集解析程序。