1. 程式人生 > >學習筆記: 反射應用、原理,完成擴展,emit動態代碼

學習筆記: 反射應用、原理,完成擴展,emit動態代碼

配置文件 lds invoke else if 情況 訪問 nbsp public 老師

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 // };//硬編碼 // } { 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動態代碼