【问题标题】:Type.GetType(), HashSet<T> and Assembly QualificationType.GetType()、HashSet<T> 和程序集限定
【发布时间】:2012-07-27 05:36:39
【问题描述】:

解决问题

Error Loading ASP.Net Profile

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

获取List&lt;int&gt;的类型时,指定类型为即可

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

但是,对于HashSet&lt;int&gt;,我必须像这样指定一个完全限定的类型名称

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&lt;T&gt; 而不是 List&lt;T&gt;
  • 鉴于必须指定版本限定,如果 .NET 运行时是 3.5(第一个具有 HashSet&lt;T&gt;)或更高版本(例如 .NET 4.5)怎么办?如果运行时完全像 Silverlight 或 Mono 怎么办?

【问题讨论】:

  • 这应该也可以(虽然我没试过):System.Collections.Generic.HashSet1[[System.Int32]], System.Core`
  • @Andrey:这也是我的期望,但这行不通。
  • 这可能是相关的:stackoverflow.com/a/2367674/39068
  • 我很快在 F# Interactive(有效)以及 PowerShell 和 Roslyn(无效)中尝试了短版本。 F# Interactive 给了我Binding session to 'C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.Core.dll'...。因为它显然不解析字符串,所以我使用了一些反射器,并且正如预期的那样,它安装了自定义AppDomain.CurrentDomain.AssemblyResolve。因此,如果您使用允许更短名称的自定义程序集解析器,则应该可以指定更短的名称。

标签: .net


【解决方案1】:

List&lt;T&gt;mscorelibHashSet&lt;T&gt; is not 中是 defined

根据documentation

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

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

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

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

【讨论】:

  • 是的,但是仅使用程序集是行不通的。我必须符合程序集、版本、文化和公钥令牌的条件。
  • 程序集的完整“名称”包括版本、文化等属性。
  • @Jason:进一步遵循文档,类型的程序集限定名称由类型名称组成,包括其命名空间,后跟一个逗号,然后是程序集的显示名称. 没有提到需要文化等msdn.microsoft.com/en-us/library/…
  • 埃里克是对的。根据Specifying Fully Qualified Type Names,仅程序集名称就足够了。不幸的是,我不确定为什么它在这里不起作用。
  • 阅读 Type.GetType(string) 的文档,它指出:“如果 typeName 完全限定为部分或完整的程序集名称,则此方法在指定的程序集中搜索。如果程序集有一个强名称,需要一个完整的程序集名称。" System.Core.dll 将有一个强名称,所以这条规则可能无论如何都适用。
猜你喜欢
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多