(如何)C#知道对象是什么类型的?

时间:2013-06-06 18:23:53

标签: c# types gettype object-type

当对象调用.GetType()方法时,C#如何知道它的类型?如果对象与同一项目中的某个其他对象类型相同怎么办?他们是否有某种独特的身份识别(如GUID)?

2 个答案:

答案 0 :(得分:5)

  

当对象调用.GetType()方法时,C#如何知道它的类型?

除了内存位置,CLR实际上还存储了每个对象的类型信息。

这存储在TypeHandle中。有关详细信息,请参阅Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects,尤其是Type Fundamentals部分。

当您在对象上调用Object.GetType()时,CLR会根据对象引用中的TypeHandle执行查找,并返回相应的类型。

答案 1 :(得分:1)

  

当对象调用.GetType()方法时,C#如何知道它的类型?

每当执行一个方法时,CLR就会创建一个列表,列出所有类型的静态元数据,这些元数据在方法内部被引用,每个元数据都引用了它们的Type对象。

创建对象时(如使用new运算符),CLR在堆中分配对象时添加一个Type对象指针,并将此指针指向静态Type对象,该对象包含类似的信息类型的名称,命名空间,它定义的方法和属性列表等。

当在对象上调用GetType时,它只返回其Type对象指向的引用,这就是为什么即使将实例存储到另一个object类型的变量中也能保持对其原始类型的正确引用(它创建的类型)。

  

如果对象与同一项目中的某个其他对象类型相同怎么办?

对象的类型由其名称,名称空间和程序集定义。在同一名称空间中不能有两个同名的类,因为编译器会抱怨Duplicate definition。但是,只要它们位于不同的名称空间System.Foo.BarSystem.Bar,它们就可以共存。