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. 关于Anaconda的环境和包管理

    Anaconda相对于原生python解释器具有更好的包管理功能,它有一个env文件夹,里面包含所要管理的所有环境:日常操作时我们可能会使用pytorch.Tensorflow等多个环境,由于每个环境 ...

  2. Mysql数据库远程链接、权限修改、导入导出等基本操作

    一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -ur ...

  3. rman 示例

    背景 rman,听这名字,好像有点真的男人意思.这玩意其实也简单,只是老忘,作为一个oracle dba爱好者,怎么少了rman呢,这个好像是oracle体系的最后一环,把它掌握了,就完成oracle ...

  4. tomcat apr 部署

    背景 这还是为了高并发的事,网上说的天花乱坠的,加了apr怎么怎么好,我加了,扯淡.就是吹牛用.我还是认为,性能问题要考设计逻辑和代码解决,这些都是锦上添花的. 步骤 1 windows 部署简单,虽 ...

  5. LIght OJ 1179

    题意: 约瑟夫环问题, 给你N 个人, 没K个出队, 问最后剩下的人的编号. 思路: 直接模拟会T, 对于N个人 , 是一个约瑟夫环问题, 当第一个人出队后, (标号一定为 k % n -1) 剩下的 ...

  6. LightOJ1004

    #include<bits/stdc++.h> using namespace std; int Map[106][106]; int Vis[106][106]; int Num[106 ...

  7. java泛型类型变量能调用的方法

    public class Person { } public class Student extends Person{ private String name; public Student(Str ...

  8. __dict__(字典的另一种用法)

    class Foo(): def __init__(self): self.name=None self.age=19 self.addr='上海' @property def dict(self): ...

  9. iOS9 新功能:Support Universal Links,iOS10 openUrl新函数

    先看官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/AppSearch/UniversalL ...

  10. form表单公用

    <?php /** * 后台总控制器 */ namespace app\common\controller; use think\Controller; use app\common\servi ...