using Ruanmou.DB.Interface;
using Ruanmou.DB.MySql;
using Ruanmou.DB.SqlServer;
using Ruanmou.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks; namespace MyReflection
{
/// <summary>
/// 1 dll-IL-metadata-反射
/// 2 反射加载dll,读取module、类、方法、特性
/// 3 反射创建对象,反射+简单工厂+配置文件 选修:破坏单例 创建泛型
/// 4 反射调用实例方法、静态方法、重载方法 选修:调用私有方法 调用泛型方法
/// 5 反射字段和属性,分别获取值和设置值
/// 6 反射的好处和局限
///
/// 反射:System.Reflection .Net框架提供帮助类库,可以读取并使用metadata
/// 反射优点:动态
/// 缺点:1 写起来复杂
/// 2 避开编译器的检查
/// 3 性能问题
/// 100w次 性能差别500倍
/// 7300ms 100次0.73ms 绝对值很小 绝大部分情况不影响你的程序性能
/// 性能优化,空间换时间 差别7倍 绝对更是小了 10000次才0.87
/// MVC第一次访问很慢 后面很快
/// EF第一次使用很慢 后面很快
///
/// </summary>
class Program
{
static void Main(string[] args)
{
try
{
Console.WriteLine("欢迎来到.net高级班vip课程,今天是Eleven老师为大家带来的反射的课程");
//{
// Console.WriteLine("************************Common*****************");
// IDBHelper iDBHelper = new MySqlHelper();
// iDBHelper.Query();
// //typeof(MySqlHelper)
// //iDBHelper.GetType()
//}
//{
// Console.WriteLine("************************Common*****************");
// IDBHelper iDBHelper = new SqlServerHelper();
// iDBHelper.Query();
//}
//{
// Console.WriteLine("************************Reflection*****************");
// Assembly assembly = Assembly.Load("Ruanmou.DB.MySql");//dll名称无后缀 从当前目录加载 1 加载dll
// Assembly assembly1 = Assembly.LoadFile(@"D:\ruanmou\online11\20180425Advanced11Course2Reflection\MyReflection\MyReflection\bin\Debug\Ruanmou.DB.MySql.dll");
// //完整路径的加载 可以是别的目录 加载不会错,但是如果没有依赖项,使用的时候会错
// Assembly assembly2 = Assembly.LoadFrom("Ruanmou.DB.MySql.dll");//带后缀或者完整路径
// foreach (var item in assembly.GetModules())
// {
// Console.WriteLine(item.FullyQualifiedName);
// }
// foreach (var item in assembly.GetTypes())
// {
// Console.WriteLine(item.FullName);
// }
// Type type = assembly.GetType("Ruanmou.DB.MySql.MySqlHelper");//2 获取类型信息
// object oDBHelper = Activator.CreateInstance(type);//3 创建对象
// //oDBHelper.Query();//oDBHelper是objec不能调用,但实际上方法是有的 编译器不认可
// IDBHelper iDBHelper = (IDBHelper)oDBHelper;//4 类型转换
// iDBHelper.Query();//5 方法调用
//}
//{
// //IOC
// Console.WriteLine("************************Reflection+Factory+Config*****************");
// IDBHelper iDBHeler = Factory.CreateHelper();//1/2
// iDBHeler.Query();//可配置可扩展 反射是动态的 依赖的是字符串
//}
//{
// Console.WriteLine("************************Reflection+Instance*****************");
// //Singleton singleton = new Singleton();
// Singleton singleton1 = Singleton.GetInstance();
// Singleton singleton2 = Singleton.GetInstance();
// Singleton singleton3 = Singleton.GetInstance();
// {
          // 私有构造函数的类 也可以通过反射 实例化
// Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
// Type type = assembly.GetType("Ruanmou.DB.SqlServer.Singleton");
// Singleton singleton4 = (Singleton)Activator.CreateInstance(type, true);
// Singleton singleton5 = (Singleton)Activator.CreateInstance(type, true);
// Singleton singleton6 = (Singleton)Activator.CreateInstance(type, true);
// }
//调用无参/有参构造函数
// {
// Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
// Type type = assembly.GetType("Ruanmou.DB.SqlServer.ReflectionTest");
// object oReflectionTest1 = Activator.CreateInstance(type);
// object oReflectionTest2 = Activator.CreateInstance(type, new object[] { 123 });
// object oReflectionTest3 = Activator.CreateInstance(type, new object[] { "123" });
// }
//反射构造泛型类实例
// {
// Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
// Type type = assembly.GetType("Ruanmou.DB.SqlServer.GenericClass`3");
// //object oGeneric = Activator.CreateInstance(type);
// Type newType = type.MakeGenericType(new Type[] { typeof(int), typeof(string), typeof(DateTime) });
// object oGeneric = Activator.CreateInstance(newType);
// }
//}
//{
// //MVC URL地址--类名称+方法名称
// Console.WriteLine("************************Reflection+Method*****************");
// Assembly assembly = Assembly.Load("Ruanmou.DB.SqlServer");
// Type type = assembly.GetType("Ruanmou.DB.SqlServer.ReflectionTest");
// object oReflectionTest = Activator.CreateInstance(type);
// foreach (var item in type.GetMethods())
// {
// Console.WriteLine(item.Name);
// }
// //oReflectionTest.Show1();
// {
// MethodInfo method = type.GetMethod("Show1");
// method.Invoke(oReflectionTest, null);
// }
// {
// MethodInfo method = type.GetMethod("Show2");
// method.Invoke(oReflectionTest, new object[] { 123 });
// }
          //反射调用静态方法
// {
// MethodInfo method = type.GetMethod("Show5");
// method.Invoke(oReflectionTest, new object[] { "麦田的稻草人" });
// method.Invoke(null, new object[] { "果然" });
// }
// {
// MethodInfo method = type.GetMethod("Show3", new Type[] { });
// method.Invoke(oReflectionTest, new object[] { });
// }
// {
// MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int) });
// method.Invoke(oReflectionTest, new object[] { 123 });
// }
// {
// MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string) });
// method.Invoke(oReflectionTest, new object[] { "Ant" });
// }
          // 重载
// {
// MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(int), typeof(string) });
// method.Invoke(oReflectionTest, new object[] { 234, "W" });
// }
// {
// MethodInfo method = type.GetMethod("Show3", new Type[] { typeof(string), typeof(int) });
// method.Invoke(oReflectionTest, new object[] { "W", 234 });
// }
          //调用私有方法
// {
// MethodInfo method = type.GetMethod("Show4", BindingFlags.Instance | BindingFlags.NonPublic);
// method.Invoke(oReflectionTest, new object[] { "天空之上" });
// }
          //反射调用泛型方法
// {
// Type typeGenericDouble = assembly.GetType("Ruanmou.DB.SqlServer.GenericDouble`1");
// Type newType = typeGenericDouble.MakeGenericType(new Type[] { typeof(int) });
// object oGeneric = Activator.CreateInstance(newType);
// MethodInfo method = newType.GetMethod("Show");
// MethodInfo methodNew = method.MakeGenericMethod(new Type[] { typeof(string), typeof(DateTime) });
// methodNew.Invoke(oGeneric, new object[] { 123, "流浪诗人", DateTime.Now });
// } //}
//{
// //ORM
// Console.WriteLine("************************Reflection+Property/Field*****************");
// People people = new People();
// people.Id = 123;
// people.Name = "Lutte";
// people.Description = "高级班的新学员"; // Console.WriteLine($"people.Id={people.Id}");
// Console.WriteLine($"people.Name={people.Name}");
// Console.WriteLine($"people.Description={people.Description}"); // Type type = typeof(People);
// object oPeople = Activator.CreateInstance(type);
// foreach (var prop in type.GetProperties())
// {
// Console.WriteLine(type.Name);
// Console.WriteLine(prop.Name);
// Console.WriteLine(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)}");
// }
// foreach (var field in type.GetFields())
// {
// Console.WriteLine(type.Name);
// Console.WriteLine(field.Name);
// Console.WriteLine(field.GetValue(oPeople));
// if (field.Name.Equals("Description"))
// {
// field.SetValue(oPeople, "高级班的新学员");
// }
// Console.WriteLine($"{type.Name}.{field.Name}={field.GetValue(oPeople)}");
// }
//}
//{
// People people = new People();
// people.Id = 123;
// people.Name = "Lutte";
// people.Description = "高级班的新学员"; // {
// //PeopleDTO peopleDTO = (PeopleDTO)people;
// PeopleDTO peopleDTO = new PeopleDTO()
// {
// Id = people.Id,
// Name = people.Name,
// Description = people.Description
// };//硬编码
// }
          //A,B类 属性很多相同, 反射A属性值t,拷贝到B的t
{
Type typePeople = typeof(People); Type typePeopleDTO = typeof(PeopleDTO);
object peopleDTO = Activator.CreateInstance(typePeopleDTO);
foreach (var prop in typePeopleDTO.GetProperties())
{ //if (prop.Name.Equals("Id"))
//{
// //object value = typePeople.GetProperty("Id").GetValue(people);
// object value = typePeople.GetProperty(prop.Name).GetValue(people);
// prop.SetValue(peopleDTO, value);
//}
//else if (prop.Name.Equals("Name"))
//{
// //object value = typePeople.GetProperty("Name").GetValue(people);
// object value = typePeople.GetProperty(prop.Name).GetValue(people);
// prop.SetValue(peopleDTO, value);
//}
object value = typePeople.GetProperty(prop.Name).GetValue(people);
prop.SetValue(peopleDTO, value);
}
foreach (var filed in typePeopleDTO.GetFields())
{
object value = typePeople.GetField(filed.Name).GetValue(people);
filed.SetValue(peopleDTO, value);
}
}
//}
Monitor.Show();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
}
}

完整代码 地址 : https://files.cnblogs.com/files/xtxtx/20180425Advanced11Course2Reflection.rar

学习笔记: 反射应用、原理,完成扩展,emit动态代码的更多相关文章

  1. 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试

    机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...

  2. python3.4学习笔记(三) idle 清屏扩展插件

    python3.4学习笔记(三) idle 清屏扩展插件python idle 清屏问题的解决,使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到 ...

  3. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  4. Sqlite学习笔记(四)&&SQLite-WAL原理

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  5. Sqlite学习笔记(四)&&SQLite-WAL原理(转)

    Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...

  6. 分布式计算框架学习笔记--hadoop工作原理

    (hadoop安装方法:http://blog.csdn.net/wangjia55/article/details/53160679这里不再累述) hadoop是针对大数据设计的一个计算架构.如果你 ...

  7. SignalR学习笔记(五) 横向扩展之SQL Server

    当一个Web应用程序达到一台服务器能力限制,即请求处理数量限制之后,有2种解决方案:纵向扩展和横向扩展. 纵向扩展即用更强的服务器(或虚拟机),或为当前的服务器添加更多的内存,CPU等 横向扩展即添加 ...

  8. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  9. C#学习笔记(八):扩展方法

    还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只).好了不多说了,今天来学习一下C#的这个特性——扩展方法. 扩展方 ...

  10. ES6学习笔记(七)-对象扩展

    可直接访问有道云笔记分享链接查看es6所有学习笔记 http://note.youdao.com/noteshare?id=b24b739560e864d40ffaab4af790f885

随机推荐

  1. 图像超分辨-IDN

    本文译自2018CVPR Fast and Accurate Single Image Super-Resolution via Information Distillation Network 代码 ...

  2. tomcat目录映射

    环境:CentOS 6 + tomcat 7 + jdk 7 目前使用2种方法: 1.tomcat/conf/server.xml <Host name="localhost" ...

  3. 内核中dump_stack()的实现,并在用户态模拟dump_stack()【转】

    转自:https://blog.csdn.net/jasonchen_gbd/article/details/44066815?utm_source=blogxgwz8 版权声明:本文为博主原创文章, ...

  4. 网页块元素定位建议使用的xpath方式

    取上图的新手上路文字 使用xpath "//div[@class='pbm mbm bbda cl']//li[contains(string(),'用户组')]/span/a/text() ...

  5. bigfile tablespace

    背景       这次终于有个linux实际迁移oracle的机会了,之前都是学习实验.想起最早时,都是windows搞oracle,又让我想起多年期一个项目,数据量太大及计算逻辑太复杂,我用存储过程 ...

  6. java使用RunTime调用windows命令行

    当Java需要调用windows系统进行交互时,可以使用Runtime进行操作. 例子: 1.调用window中获取关于java相关的进行信息 Runtime rt = Runtime.getRunt ...

  7. Docker入门 - 006 Docker 多种数据库的安装

    Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...

  8. Ex3_7无向图二部图_十一次作业

    (a) 从图中的某个顶点做深度优先遍历,并将不同层的顶点标记为红黑两种颜色,使得每条树边的两个顶点的颜色都不相同,如果遇到一条回边并且两个顶点的颜色都相同则说明图不是二部图. (b)如果存在一个长度为 ...

  9. ActiveMQ在Windows下的安装与启动(懒人专属)

    其实这些ActiveMQ官网都有,但是如果你懒得看官网,那就直接看这吧! 1. 官网下载最新的ActiveMQ安装包 apache-activemq-x.x.x-bin.zip并解压   2.进入安装 ...

  10. 轻松搞懂elasticsearch概念

      本文主要介绍elasticsearch6.0的一些基本概念,有助于深入理解.研究elasticsearch和elk系统 一图胜千言 elasticsearch与mysql参照来看 添加一条数据 紫 ...