使用"."前缀的类型名称的Type.GetType搜索规则是什么?

4

例如:Type.GetType(".System.Collections.ArrayList", false, false)Type.GetType("System.Collections.ArrayList", false, false)

我曾认为它们是等价的,但我注意到前者解析时间是后者的两倍,并且进一步调查后,我找不到对前者的明确支持:http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx

它们是否等价,如果是,有什么想法可以解释为什么前者解析时间是后者的两倍?


4
为什么以 . 开头命名类型名称是有意义的呢? - Hans Passant
@HansPassant - 在我看来,以 . 开头是在说“查找‘全局’命名空间”...从实际角度来看,如果您有一个“打开”的命名空间列表,您想尝试解析可能不完全限定的类型名称,那么使用类似 [""; "System"; "System.Collections"] 的列表更容易处理,其中 "" 表示这个虚构的“全局”命名空间,这样您就可以尝试使用 . 分隔符将命名空间列表与可能的类型名称组合起来,而无需特殊处理可能完全限定的类型名称。 - Stephen Swensen
看了一下类型名称的语法,感觉前面的句点被允许是一个bug。 - Daniel
@StephenSwensen:在没有全局命名空间限定符的情况下,您可以使用程序集名称进行完全限定吗? - Daniel
@Daniel - 我倾向于认为允许前导句点可能是一个错误(BNF是一个很好的支持来源)。我注意到其他指标表明有些奇怪的事情正在发生:调用 Type.GetType("..",true,true) 将导致异常消息 "Could not load type '.'" ... 在某个地方,它会剥离单个前导句点并忘记它曾经这样做过。 - Stephen Swensen
@Daniel - 在这里完整的程序集限定名称并没有什么帮助,因为语法是在类型名称后面跟着程序集名称...但是没有全局命名空间标识符并不是真正的大问题,我只需要使用一个函数像 let withNamespace tyName ns = if ns = "" then tyName else ns + "." + tyName 来连接命名空间(包括我的概念上的全局命名空间用一个空字符串表示)和类型名称。 - Stephen Swensen
2个回答

0

这里实际上没有全局命名空间的概念,因为在这个上下文中打开的命名空间并不重要。

可以将其视为始终从根(全局)搜索。Type.GetType 不属于任何命名空间,也没有打开任何命名空间。您必须限定您正在搜索的类型,包括其命名空间。


0
从您提供的链接中:
引用: “点(.)表示命名空间标识符。”
我猜测,如果有前导点(.),则会扫描所有命名空间,甚至是当前程序集之外的命名空间。

我有类似的想法,但是 Type.GetType(".Collections.ArrayList", false, false) 无法解析。 - Stephen Swensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接