我正在深入阅读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
认为你表示数组类型“
答案 0 :(得分:2)
System.Collections.Generic.List`1[System.String]
是封闭泛型类型的名称。
开放通用类型的名称不是System.Collections.Generic.List`1[]
,而是System.Collections.Generic.List`1
。
这基本上就是这一段所说的。
答案 1 :(得分:1)
。字符串传递的.Net类型名称使用[<type1>(,<typeN>)]
来表示泛型类型/函数参数列表。它自己的[]
表示数组类型。
此外,任何泛型类型名称都将具有构造:
`n
在其字符串名称后面,指示该类型具有的泛型参数的 number 。所以:
MyNamespace.MyType`1
引用开放泛型类型 MyNamespace.MyType<>
(即未提供通用参数)。
尽管
MyNamespace.MyType`1[System.String]
引用已关闭的泛型类型 MyNamespace.MyType<string>
。
请注意,还有一些与Type.GetType
有关的规则 - 在以下任何一种情况下,您只能省略程序集名称(包括公钥标记,如果适用):
mscorlib
。因此,许多核心类型可以由字符串指定,只包含其名称空间限定名称,包括泛型 - 当类型名称被指定为类型参数时也是如此(与上面的System.String
一样)