C# 反射和特性(获取Type对象)

获取Type对象

本节学习,使用实例对象的GetType方法和typeof运算符和类名来获取Type对象。object

类型包含了一个叫作GetType的方法,它返回对实例的Type对象的引用。由于每一个类型最终

都是从object派生的,所以我们可以在任何类型的对象上使用GetType方法来获取它的Type对

象,如下所示:

复制代码
Type t=myInstance.GetType();

下面的代码演示了如何声明一个基类以及从它派生的子类。Main方法创建了每一个类的实例

并且把这些引用放在了一个叫作bca的数组中以方便使用。在外层的foreach循环中,代码得到

了Type对象并且输出类的名字,然后获取类的字段并输出。图25-2演示了内存中的对象。

csharp 复制代码
using System;
using System.Reflection

class BaseClass
{
    public int BaseField=0;
}

class DerivedClass:BaseClass
{
    public int DerivedField=0;
}

class Program
{
    static void Main()
    {
        var bc=new BaseClass();
        var dc=new DerivedClass();

        BaseClass[] bca=new BaseClass[]{bc,dc};

        foreach(var v in bca)
        {
            Type t=v.GetType();  //获取类型

            Console.WriteLine($"Object type:{t.Name}");

            FieldInfo[] fi=t.GetFields();  //获取字段信息
            foreach(var f in fi)
            {
                Console.WriteLine($"       Field:{f.Name}");
            }
            Console.WriteLine();
        }
    }
}

还可以使用typeof运算符来获取Type对象。只需要提供类型名作为操作数,它就会返回Type

对象的引用,如下所示:

csharp 复制代码
Tyep t=tyepof(DerivedClass);

下面的代码给出了一个使用typeof运算符的简单示例:

csharp 复制代码
using System;
using System.Reflection;

namespace SimpleReflection
{
    class BaseClass
    {
        public int BaseField;
    }

    class DerivedClass:BaseClass
    {
        pubic int DerivedField;
    }

    class Program
    {
        static void Main()
        {
            Type tbc=typeof(DerivedClass);
            Console.WriteLine($"Object type:{tbc.Name}");
            FieldInfo[] fi=tbc.GetFields();
            foreach(var f in fi)
                Console.WriteLine($"    Field:{f.Name}");
        }
    }
}