在我看来,反射就是一个快速操作元数据的工具,它可以快速通过对一个模板对象操作来实现对其他对象操作实现相同效果。
C#反射技术主要基于System.Type类和System.Reflection.Assemble类,通过Type类可以访问关于任何数据类型的信息,Assemble类用于访问给定程序集的相关信息,或把这个程序集, 加载到程序中。
命名空间 描述
System.Reflection.Assembly 程序集
System.Reflection.MemberInfo 成员信息
System.Reflection.EventInfo 事件
System.Reflection.FieldInfo 字段
System.Reflection.MethodBase 基类方法
System.Reflection.ConstructorInfo 构造函数
System.Reflection.MethodInfo 方法
System.Reflection.PropertyInfo 属性
System.Type 类、对象的类型对象
Person p = new Person();
p.name = "小刘";
p.sex = "男";
p.study();
//反射
//指定一个程序集
Assembly assembly = Assembly.LoadFrom(".dll");
//Assembly assembly = Assembly.LoadFile(".dll");
//获取程序集中一个对象/全部对象的类型,
Type t1 = assembly.GetType("dll文件中的一个class");
Type t3 = typeof(Person); //直接获取类的类型
//获取对象类型的属性方法、、
//方式一
PropertyInfo[] property = t3.GetProperties(); // 获取全部属性
// PropertyInfo[] propertyp1 = typeof(PERSONP).GetProperties();
MethodInfo study = t1.GetMethod("study"); //获取指定方法
ConstructorInfo[] constructors = t1.GetConstructors(); //结构体
//ConstructorInfo cons = t1.GetConstructor();
//dynamic动态创建反射对象实例
dynamic objt1 = Activator.CreateInstance(t1); //创建实例对象
//方式二
//foreach(),获取需要被反射(复刻)的对象类型
foreach (var p3 in property)
{
var pro = property.SingleOrDefault(a => a.Name == p3.Name);
var st = study.Invoke(objt1, null);
Console.WriteLine($"{p3.Name}+{p3.PropertyType} +{p3.GetValue(p)}");
if (p3.Name.Equals("name"))
{
p3.SetValue(p, "二嘎子");
}
if (p3.Equals(p))
{
p3.SetValue(p.id, "088826");
p3.SetValue(p.sex, "男");
}
}