学习笔记: 反射应用、原理,完成扩展,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

 

posted @ 2018-06-04 10:09  小谭行天下  阅读(364)  评论(0编辑  收藏  举报