反射

  1. dll-IL-metadata-反射
  2. 反射加载dll,读取module、类、方法、特性
  3. 反射创建对象,反射+简单工厂+配置文件 破坏单例 创建泛型
  4. 反射调用实例方法、静态方法、重载方法 选修:调用私有方法 调用泛型方法
  5. 反射字段和属性,分别获取值和设置值
  6. IL:也是一种面向对象语言,但是不太好阅读
  7. metadata元数据:数据清单,描述了DLL/exe里面的各种信息
  8. 反射Reflection:System.Reflection,是.Net Framework提供的一个帮助类库,可以读取并使用metadata
反射是无处不在的,MVC-Asp.Net-ORM-IOC-AOP 几乎所有的框架都离不开反射
反射的优点: 动态
反射的缺点:
  1. 使用麻烦
  2. 避开编译器检查
  3. 性能问题

反射使用方法

Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");//1 动态加载
Type dbHelperType = assembly.GetType("Ruanmou.DB.SqlServer.SqlServerHelper");//2 获取类型
object oDBHelper = Activator.CreateInstance(dbHelperType);//3 创建对象
IDBHelper dbHelper = (IDBHelper)oDBHelper;//4 接口强制转换
dbHelper.Query();//5 方法调用
反射获取类的全部属性
Type type = typeof(People);
object oPeople = Activator.CreateInstance(type);
foreach (var prop in type.GetProperties())
{
    Console.WriteLine($"{type.Name}.{prop.Name}={prop.GetValue(oPeople)}");
    if (prop.Name.Equals("Id"))
    {
        prop.SetValue(oPeople, 234);
    }
    else if (prop.Name.Equals("Name"))
    {
        prop.SetValue(oPeople, "饿了么");
    }
    Console.WriteLine($"{type.Name}.{prop.Name}={prop.GetValue(oPeople)}");
}
反射调用方法
 MethodInfo method = type.GetMethod("Show3", new Type[] { });
 method.Invoke(oTest, null);//无参方法

 MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string),    typeof(int) });
 method.Invoke(oTest, new object[] { "PHS", 345 });//有参方法

 var method = type.GetMethod("Show4", BindingFlags.Instance |  BindingFlags.NonPublic);
 method.Invoke(oTest, new object[] { "我是老王" });//私有方法调用 破坏单例