【问题标题】:Nested Class .GetType()嵌套类 .GetType()
【发布时间】:2012-02-02 10:29:45
【问题描述】:

在处理嵌套类并将类型名称输出到控制台窗口时,我注意到一些奇怪的事情。我想知道是否有人可以为我解释一下。在主类上调用GetType() 时,它会返回我所期望的,即相关命名空间之后的类名称。即Namespace.Namespace.Classname

但是,当我从封闭类中调用一个函数以返回嵌套类的类型时,我得到的返回值如下:

Namespace.Namespace.ClassNameEnclosing + ClassNameNested.

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

【问题讨论】:

    标签: c# types nested-class


    【解决方案1】:

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

    我不能随便(通过对 ECMA-335 的简要研究)判断一个包含点的非限定类型名称在 IL 中是否真的有效;我怀疑会,但它会使各种诊断更难阅读。

    【讨论】:

    • 感谢您的回复。我明白了,尽管该类本身就是一个类,但它没有自己的命名空间吗?加号基本上表明这种类型是对封闭类的命名空间的补充?
    • @CSharpened:是的,这就是它的命名空间——如果你查看(比如)System.Collections.Generic.SortedDictionary<TKey, TValue>.ValueCollection 的命名空间,你会发现它只是 System.Collections.Generic
    【解决方案2】:

    反射不是特定于语言的。

    点表示法 (Namespace.Namespace.OuterClassName.InnerClassName) 特定于 C#。反射必须适用于可用于编译为 IL 的每种语言。此外,如果不检查Type 类的其他属性,您如何确定OuterClassName 不仅仅是命名空间的另一部分?

    你问为什么不简单地以点表示法返回?你不妨问“为什么它不简单地返回为 IronPython 表示法”,或者 IronLisp 表示法,或者 L# 表示法,或者 BOO 表示法,或者......

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

    【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-10
      • 1970-01-01
      • 2016-09-02
      • 2011-06-01
      • 1970-01-01
      相关资源
      最近更新 更多