为什么Type类不在System.Reflection命名空间中?

5

Type 的一切都具有反射性质。这是因为 TypeSystem.Reflection 中的其他类更常用吗?还是因为它的功能更像系统类而不是反射类?

简而言之,我一直想知道 System.Type 位置背后的动机。


这可能是因为它是反射机制。就像你的眼睛一样。你永远不会真正看到你的眼睛。你最多只能看到你眼睛的反映。 - Chuck Conway
当然,眼睛是看到自己的反射的机制。虽然这个评论只是加强了这个问题。因为你不能直接看到自己的眼睛(即不能直接看到类型信息),你需要某种反射来获取任何信息(即“类型”)。 - Joe
3个回答

1
一个程序集有类型,Assembly位于 System.Reflection,这很奇怪。
所以我的猜测是与 Object 实现方法 GetType 有关,该方法返回一个 Type

1
顺便提一下,在Java中,Object.getClass与此类似。 - Josh Lee
虽然按照同样的逻辑,MemberInfo也应该在System命名空间中,对吧?Type实现了GetMember()方法,该方法返回一个MemberInfo。在BCL中,命名空间的前向引用随处可见。 - Joe
@Arc,确实如此,但是Object.GetType()的使用情况比Object.GetType().GetMember()要频繁得多。 - João Angelo
没错,如果Type位于System.Reflection中,你仍然可以使用o.GetType.FullName而无需额外的using块。但是,如果要对Type进行其他操作,通常还是需要添加using System.Reflection,即使它在System中也是如此。 - Joe

1

Type类不仅仅在System.Reflection中使用,还在许多其他地方使用。通过Reflector进行快速搜索会发现有数百个使用它的地方。它在System.Configuration、System.Data、System.Drawing、System.Linq、System.Windows.Forms等方面非常关键。在这些类中实际使用Type实例的方式是不可见的。很可能使用了System.Reflection,但这只是一个实现细节,不会影响程序。

考虑到使用typeof运算符和object.GetType可以轻松创建这些类所需的Type实例,并且除非实际编写反射代码,否则您永远不必使用System.Reflection,因此Type在System命名空间中应该有一个易于访问的位置。


0

我猜这是因为Object作为GetType方法的原因。

微软编码实践告诉我们,一个类不应该引用子命名空间中的类型。但实际上,BCL经常违反这个规则 ;o)


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