1

C#を深く読んでいて章のパラが理解できなかった

もう 1 つのメソッド (今回は .NET 1.1 に既に存在していたもの) を調べる価値があるのはType.GetType(string)、 とそれに関連する Assembly.GetType(string)メソッドで、どちらも に動的に相当するものを提供しtypeofます。リスト 3.11 の出力の各行をGetType、適切なアセンブリで呼び出されたメソッドに渡すことができると期待するかもしれませんが、残念ながら、実際はそれほど単純ではありません。閉じた構築型の場合は問題ありません。型引数は角かっこで囲むだけです。ただし、ジェネリック型定義の場合は、角かっこを完全に削除する必要があります。そうしない GetTypeと、配列型を意味すると見なされます。リスト 3.12 は、これらすべてのメソッドの動作を示しています。

そして、コードの例では、作者は彼がしないように頼んだことをしたと私は信じています:

string listTypeName = "System.Collections.Generic.List`1";
Type defByName = Type.GetType(listTypeName);

Type closedByName = Type.GetType(listTypeName + "[System.String]"); // did here ? , since he passed the listTypeName + [Type args] , so compiler should think it's array?
Type closedByMethod = defByName.MakeGenericType(typeof(string));

または、私が間違っている可能性があります。「ジェネリック型定義については、角括弧を完全に削除する必要があります。それ以外の場合GetTypeは、配列型を意味すると思います」

4

2 に答える 2

2

System.Collections.Generic.List`1[System.String]クローズ ジェネリック型の名前です。

オープンジェネリック型の名前は but ではありませSystem.Collections.Generic.List`1[]System.Collections.Generic.List`1

基本的に、この段落で述べていることはそれだけです。

于 2013-01-14T09:56:59.650 に答える
1

文字列で渡される.Net型名[<type1>(,<typeN>)]は、ジェネリック型/関数パラメータリストを示すために使用されます。 []それ自体が配列型を示します。

また、ジェネリック型の名前は次のように構成されます。

`n

文字列名の後に、型が持つジェネリックパラメータの数を示します。それで:

MyNamespace.MyType`1

オープンジェネリック型 を参照しますMyNamespace.MyType<>(つまり、ジェネリック引数が指定されていません)。

一方

MyNamespace.MyType`1[System.String]

閉じたジェネリック型 を参照しMyNamespace.MyType<string>ます。

関係するルールがさらにあることに注意してください。つまりType.GetType、次のいずれかの場合にのみ、アセンブリ名(該当する場合は公開鍵トークンを含む)を省略できます。

  1. 要求されたタイプは、呼び出し元のアセンブリにあります
  2. タイプリクエストはにありmscorlibます。

したがって、多くのコアタイプは、ジェネリックスを含め、名前空間で修飾された名前だけで文字列で指定できます。タイプ名がタイプ引数として指定されている場合も同様です(System.String上記のように)。

于 2013-01-14T10:01:31.233 に答える