2012-02-02 134 views
7

我嵌套类乱搞和输出类型控制台窗口的名称时,发现了一些奇怪的。我想知道是否有人能为我解释一下。当在主类上调用GetType()时,它返回我所期望的,这是相关命名空间之后的类的名称。即Namespace.Namespace.Classname嵌套类.GetType()

然而,当我调用一个函数从封闭类中返回嵌套类的类型我得到的返回值是这样的:

Namespace.Namespace.ClassNameEnclosing + ClassNameNested. 

为什么不能简单地返回点符号。为什么是+符号?我只是很好奇背景中发生了什么,导致这种表示法。

回答

5

点用于表示名称空间。嵌套类仍然在同一个命名空间中,它只是嵌套在一个类中。

我不能随便说(从ECMA-335的简要分析),其中包括一个点实际上在IL有效不合格的类型名称是否;我想嫌疑人它会,但它会使各种诊断更难以阅读。

+0

感谢您的回复。我明白了,虽然这个类本身就是一个类,但它没有自己的名字空间?加号符号基本上表明这种类型是对封闭类名称空间的补充? – CSharpened 2012-02-02 10:33:39

+0

@CSharpened:是的,这是它的命名空间 - 如果你看(比如说)'System.Collections.Generic.SortedDictionary .ValueCollection'的命名空间,你会发现它只是'System.Collections.Generic'。 – 2012-02-02 10:37:10

+0

优秀的回复。谢谢。这很清楚。 – CSharpened 2012-02-02 10:38:14

1

反射不是语言特定的。

的点标记(Namespace.Namespace.OuterClassName.InnerClassName)是特定于C#。反思必须适用于您可以用来编译为IL的每种语言。此外,如何在反思时确定OuterClassName不仅仅是名称空间的另一部分,而且不需要检查Type类的其他属性?

你问它为什么简单的返回点符号?您可能还会问“为什么它不会简单地返回为IronPython符号”,或IronLisp符号,L#符号或BOo符号,还是...

了解反射中使用的符号,您可以使用它分析用任何语言编写的代码。