学习笔记: 反射应用、原理,完成扩展,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
随机推荐
- Learning Discriminative Features with Class Encoder
近来论文看了许多,但没多少时间总结下来.今天暂时记录一篇比较旧的论文,选择理由是 Discriminative features. 做图像说白了就是希望有足够有判别性的特征,这样在分类或者匹配.检索的 ...
- Java常见异常及解释
- Mudo C++网络库第十一章学习笔记
反思C++面向对象与虚函数 C++语言学习可以看<C++ Primer>这本书; 在C++中进行面向对象编程会遇到其他语言中不存在的问题, 其本质原因是C++ class是值语义, 而非对 ...
- 子元素position:absolute定位之后脱离文档流,怎么使子元素撑开父元素
纯粹的CSS无法实现.因为position:absolute就是脱离文档流,怎么能让父元素不塌陷呢? 目前想到的只能用js和jquery来实现了,用js获取子元素的高度,赋值给父元素. <!DO ...
- MySQL--视图view、触发器trigger、事务(start transaction)、存储过程(特殊的数据逻辑处理函数)、流程控制(if,case....)
mysql致力于项目开发及数据库管理之间解耦合(帮忙封装一些数据处理方法,使应用程序的开发者可以专注于应用程序的开发),但受限于不同部门沟通的成本问题,现阶段直接使用的价值不大. 一.视图(只能sel ...
- 2)django-请求生命周期
1)下图是django请求生命周期 2)详细例子
- Python基础-入门之路PYTHON-包 相对导入&绝对导入
什么是包 包也是一种模块,但本质上就是一个文件夹 对于使用者而言 使用方式和模块没有任何区别 本质上就是一个文件夹 不同之处在于 多了一个__init__.py 叫包的初始化文件 import导入模块 ...
- Java位运算符浅析
在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率. 位运算符,这个”位”代表这什么? 位:二进制位简称“位”,是二进制记数系统中表示小于2的整数的符号,一般用1或 0 ...
- Confluence 6 使用 Apache 和 mod_proxy 添加 SSL和其他
添加 SSL 如果你计划在你的应用中启用 SSL ,请参考 Securing your Atlassian applications with Apache using SSL页面中的内容,并确定你在 ...
- Confluence 6 查看内容索引概要
内容索引,通常也被称为查找索引,这个索引被用来在 Confluence 中支持查找.这个索引同时也被其他的一些功能使用,例如在归档邮件中构建邮件主题,View Space Activity 的特性和将 ...