反射
反射是指对程序集中的元数据(如:办法、类型、参数、字段、属性、自定义个性等)进行查看的过程。咱们是通过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); } }
后果: