一、反射
反射是指对程序集中的元数据进行检查的过程。当C#被编译成CIL时,它会维持关于代码的大部分元数据(以前代码被编译成机器语言时,会丢弃元数据)。
利用反射可以枚举出程序集中的所有类型,找出满足特定条件的那些。
1、反射可以做的事
1.1 访问程序集中的元数据
读取类型的元数据,关键在于获得System.Type的一个实例,它代表目标类型实例。System.Type提供了获取类型信息的所有方法。获得对类型的Type的引用主要通过object.GetType() 或typeof()
//object.GetType():获取一个对象实例
//静态类无法使用,因为静态类无法实例化
DateTime dateTime = new DateTime();
Type type = dateTime.GetType();
foreach (var item in type.GetProperties())
{
Console.WriteLine(item.Name);
}
//Enum.Parse():获取标识了一个枚举的type对象,将一个字符串转换成特定的枚举值
ThreadPriorityLevel level = (ThreadPriorityLevel)Enum.Parse(typeof(ThreadPriorityLevel), "Idle");
1.2 使用元数据在运行时动态调用类型的成员
demo没怎么看懂,先放着
2、泛型类型上的反射
CLR2.0新增了一些列方法来判断给定类型是否支持泛型参数和泛型实参:
Type type;
type = typeof(Nullable<>);
Console.WriteLine(type.IsGenericType); //指示类型是否为泛型
Console.WriteLine(type.ContainsGenericParameters); //指示类型是否包含泛型实参
type = typeof(Nullable<DateTime>);
Console.WriteLine(type.ContainsGenericParameters);
Console.WriteLine(type.IsGenericType);
从泛型获取泛型实参:
Stack<int> stack = new Stack<int>();
Type type=stack.GetType();
//调用GetGenericArguments()可获得一个由System.Type实例构成的一个数组,实例顺序是它们被声明的顺序
foreach (var item in type.GetGenericArguments())
{
Console.Write(item.Name+" "+ item.FullName);
}
输出