7

質問を解決する際に

ASP.Netプロファイルの読み込み中にエラーが発生しました

わからない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のようなものである場合はどうなりますか?
4

1 に答える 1

5

List<T>定義されていますがmscorelib、でHashSet<T> はありません

ドキュメントによると:

タイプが現在実行中のアセンブリまたはMscorlib.dllにある場合は、名前空間で修飾されたタイプ名を指定するだけで十分です。

2番目の質問については、現在のフレームワーク/プロファイルで使用できないアセンブリに修飾された型名を指定すると、GetTypenullが返されます。

すべてのアセンブリ属性が必要な理由は、Type.GetTypeドキュメントで指定されています(コメントでJason Malinowskiが指摘しているように)。

typeNameに名前空間が含まれているがアセンブリ名は含まれていない場合、このメソッドは呼び出し元のオブジェクトのアセンブリとMscorlib.dllのみをこの順序で検索します。typeNameが部分的または完全なアセンブリ名で完全に修飾されている場合、このメソッドは指定されたアセンブリを検索します。アセンブリに厳密な名前がある場合は、完全なアセンブリ名が必要です。

于 2012-07-27T05:51:12.143 に答える