反射
程序是用来处理数据的,文本和特性都是数据,而我们程序本身(类的定义和BLC中的类)这些也是数据
有关程序及其类型的数据被称为元数据(metadata),它们保存在程序的程序集中。
程序运行时,可以查看其他程序及或其本身的元数据。一个运行的程序查看本身的元数据或其他程序集的元数据的行为叫做反射。
使用Type类来反射数据
预定义类型(int,long和string等)和BCL中的类型(Console,IEnumerable等)和程序员自定义类型(Myclass等)每种类型都有自己的成员和特性。
BCL声明了一个叫做Type的抽象类,它被设计用来包含类型的特性。使用这个类的对象能让我们获取程序使用的类型信息。
由于Type是抽象类,因此不能利用它去实例化对象。
关于Type的重要事项如下:
1、对于程序中用到的每一个类型,CLR都会创建一个包含这个类型信息的Type类型的对象。
2、程序中用到的每一个类型都会关联到独立的Type类的对象。
3、不管创建的类型有多少个示例,只有一个Type对象会关联到所有这些实例。
举例
首先创建一个类,用于测试
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 反射
{
class myclass
{
private int ID;
private string name;
public int id;
public string m_name;
public string str { get; set; }
public string str2 { get; set; }
public string str3 { get; set; }
void test()
{
}
void test2()
{
}
}
}
下面是Type的常用方法介绍
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace 反射
{
class Program
{
static void Main(string[] args)
{
//创建的每一个类都会对应一个type对象,这个type对象用来存储这个类有哪些成员 就是有什么字段 什么属性 什么方法,但是不存储具体的数据
myclass m_class = new myclass();//具体的数据是存储在类中的
Type type = m_class.GetType();//通过对象获取所对应的type对象
Console.WriteLine(type.Name);//获取类的名字
Console.WriteLine(type.Assembly);//获取类所存在的程序集
Console.WriteLine(type.Namespace);//获取类所在的命名空间
FieldInfo[] fieldInfo = type.GetFields();//GetFields 这个的返回值是FieldInfo数组 类型的 这个类型位于using System.Reflection;命名空间下 这个方法是获取类当中的所有公开字段 !!!!!注意是公开 字段
foreach (var item in fieldInfo)
{
Console.WriteLine(item);
}
PropertyInfo[] propertyInfo = type.GetProperties();//这是获取类中的所有属性
foreach (var item in propertyInfo)
{
Console.WriteLine(item);
}
MethodInfo[] methodInfo = type.GetMethods();//获取类中的所有方法 包括get set方法 也包括继承自Object的方法
foreach (var item in methodInfo)
{
Console.WriteLine(item);
}
Console.ReadKey();
}
}
}
按F5运行 运行结果