反射

反射是指对程序集中的元数据(如:办法、类型、参数、字段、属性、自定义个性等)进行查看的过程。咱们是通过System.Type的实例来拜访类型的元数据。

应用System.Type拜访元数据

读取类型的元数据,首先要取得System.Type的一个实例,它代表了指标类型实例。System.Type提供了获取类型信息的所有办法。次要是通过object.GetType()和typeof()操作符达到这个目标。

  • 应用GetType()
    Object 对象蕴含一个GetType()成员,胜利调用GetType()的关键在于取得一个对象实例。例如:动态类无奈实例化,无奈调用GetType()。
DateTime dateTime = new DateTime();Type type = dateTime.GetType();// 获取该类型的所有公共属性foreach (System.Reflection.PropertyInfo property in type.GetProperties()){    Console.WriteLine(property.Name);}
输入:

  • typeof()
    在编译时绑定到特定的Type实例,并间接获取类型作为参数。

       int value = (int)Enum.Parse(typeof(ThreadPriorityLevel), "Idle");   Console.WriteLine(value);

    也能够应用typeof表达式验证value对象的类型:

       if (value.GetType() == typeof(int)) {      // ...   }         

其中GetType() 在运行时返回对象的类型(早期绑定),typeof()返回指定类的类型(晚期绑定,编译时已知)
尽量采纳typeof()这个操作符获取Type对象,因为操作符生成的代码通常更快。

成员调用

应用System.Type拜访元数据后,可调用他们。

public class MagicClass{    private int magicBaseValue;    public MagicClass()    {        magicBaseValue = 9;    }    public int ItsMagic(int preMagic)    {        return preMagic * magicBaseValue;    }}class Program{    static void Main(string[] args)    {        // 获取构造函数,并创立一个MagicClass的实例        Type magicType = typeof(MagicClass);        ConstructorInfo magicConstructor = magicType.GetConstructor(Type.EmptyTypes);        object magicClassObject  = magicConstructor.Invoke( new object[] { });                   // 获取ItsMagic办法并应用100的参数值进行调用        MethodInfo magicMethod = magicType.GetMethod("ItsMagic");        // Invoke办法第一个值为:要在其上调用办法或构造函数的实例对象        // Invoke办法第一个值为:被调用办法或构造函数的参数列表。        object magicValue = magicMethod.Invoke(magicClassObject, new object[] { 100 });        Console.WriteLine("MethodInfo.Invoke()");        Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue);           }

后果:

泛型类型上的反射

  • 在泛型类型上执行运行时反射,能够判断类型参数的类型:
public class Stack1<T>{    public void Add(T i)    {        // 判断类型参数的类型        Type t = typeof(T);    }}

在取得类型参数的Type对象实例化后,就可在类型参数上执行反射,从而判断他的行为,并针对具体类型来调整Add办法,使其能更无效地反对这种类型。

  • 为泛型类或办法获取类型参数
public class Stack1<T>{    public void Add(T i)    {        // 判断类型参数的类型        Type t = typeof(T);    }}class Program{    static void Main(string[] args)    {        // 2、为泛型类或办法获取类型参数        Type t = typeof(Stack1<int>);        foreach (Type t1 in t.GetGenericArguments())        {            Console.WriteLine("Type parameter:" + t1.FullName);        }    }

后果: