学习笔记: 反射应用、原理,完成扩展,emit动态代码
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动态代码的更多相关文章
- 机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理、源码解析及测试
机器学习实战(Machine Learning in Action)学习笔记————03.决策树原理.源码解析及测试 关键字:决策树.python.源码解析.测试作者:米仓山下时间:2018-10-2 ...
- python3.4学习笔记(三) idle 清屏扩展插件
python3.4学习笔记(三) idle 清屏扩展插件python idle 清屏问题的解决,使用python idle都会遇到一个常见而又懊恼的问题——要怎么清屏?在stackoverflow看到 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- Sqlite学习笔记(四)&&SQLite-WAL原理
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- Sqlite学习笔记(四)&&SQLite-WAL原理(转)
Sqlite学习笔记(三)&&WAL性能测试中列出了几种典型场景下WAL的性能数据,了解到WAL确实有性能优势,这篇文章将会详细分析WAL的原理,做到知其然,更要知其所以然. WAL是 ...
- 分布式计算框架学习笔记--hadoop工作原理
(hadoop安装方法:http://blog.csdn.net/wangjia55/article/details/53160679这里不再累述) hadoop是针对大数据设计的一个计算架构.如果你 ...
- SignalR学习笔记(五) 横向扩展之SQL Server
当一个Web应用程序达到一台服务器能力限制,即请求处理数量限制之后,有2种解决方案:纵向扩展和横向扩展. 纵向扩展即用更强的服务器(或虚拟机),或为当前的服务器添加更多的内存,CPU等 横向扩展即添加 ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- C#学习笔记(八):扩展方法
还记得第一次使用DOTween时,发现缓动方法竟然是可以直接用Transform对象中调用到,当时就被震撼到了(那是还是C#小白一只).好了不多说了,今天来学习一下C#的这个特性——扩展方法. 扩展方 ...
- ES6学习笔记(七)-对象扩展
可直接访问有道云笔记分享链接查看es6所有学习笔记 http://note.youdao.com/noteshare?id=b24b739560e864d40ffaab4af790f885
随机推荐
- Python3-IO模型
IO模型 IO模型介绍 阻塞IO(blocking IO) 非阻塞IO(non-blocking IO) 多路复用IO(IO multiplexing) 异步IO(Asynchronous I/O) ...
- Linux Makefile 生成 *.d 依赖文件及 gcc -M -MF -MP 等相关选项说明【转】
转自:https://blog.csdn.net/qq1452008/article/details/50855810 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog. ...
- shell 不使用循环批量创建用户
..}|tr " " "\n"|awk '{print "useradd",$0,";date +%N|md5sum|cut -c ...
- Linux内核的整体架构简介
1. 前言 本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统.之后,会介绍Linux内核源文件的目录结构,并和各个软 ...
- Mudo C++网络库第十一章学习笔记
反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...
- Nodejs脚手架搭建基于express的应用
原文链接:https://www.cnblogs.com/FE-yanyi1993/p/6413042.html 这篇写的非常详细,此处只做记录. 1.安装生成器 $ npm install expr ...
- 028_nginx_https证书
一. 事件经过 2017年3月份谷歌和火狐的调查人员发现赛门铁克打破了行业规则误签发127张SSL证书随着调查进一步开展发现误签发的证书数量达到惊人的3万多张. 这个数字震撼了业界专家因为赛门铁克是市 ...
- T-SQL GROUP BY子句 分组查询
SQL Server GROUP BY子句与SELECT语句协作使用,以将相同的数据分组. GROUP BY子句位于SELECT语句中的WHERE子句之后,位于ORDER BY子句之前. 语法 以下是 ...
- HBase Snapshot简介
一.简介 HBase 从0.95开始引入了Snapshot,可以对table进行Snapshot,也可以Restore到Snapshot.Snapshot可以在线做,也可以离线做.Snapshot的实 ...
- 解决get方法提交参数中文乱码问题:
解决get方法提交参数中文乱码问题: 1找到你们的tomcat的目录 2在这个目录下面\tomcat61-32\tomcat61\conf 3找到server.xml ,用notepad打开(没有就下 ...