1

我正在深入阅读C#,但我无法理解本章的段落

另一种方法——这一次已经存在于 .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]是封闭的泛型类型的名称。

并且开放泛型类型的名称不是System.Collections.Generic.List`1[]but 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 回答