反射描述了在運行過程當中檢查和處理程序元素的功能。反射能夠完成如下任務:c#
Type類是一個抽象的基類。只要實例化一個Type對象,實際上就是實例化了Type的一個派生類。獲取給定類型的Type引用三種方式:緩存
Type的屬性能夠分爲三類。首先,許多屬性均可以獲取包含與類相關的各類名稱的字符串。函數
其次,屬性能獲取Type對象的引用。性能
最後,許多布爾類型屬性表示這種類型是一個類,仍是一個枚舉等。這些屬性包含:IsAbstract、IsArray、IsClass、IsEnum、IsInterface、IsPointer、IsPrimitive(一種預約義的基本數據類型)、IsPublic、IsSealed和IsValueType等。優化
Type的大多數方法都用於獲取對應數據類型的成員信息:構造函數、屬性、方法和事件等。它的許多方法都具備想同的模式。spa
GetMember()和GetMembers()方法返回數據類型的任何成員或全部成員的詳細信息,無論這些成員是構造函數、屬性或方法等。.net
Assembly類容許訪問給定程序集的元素據,能夠加載和執行程序集的方法等。使用Assembly實例以前須要加載對應的程序集到正在運行的進程中。使用靜態成員Assembly.Load()或Assembly.LoadFrom(),Load()方法的參數是程序集的名稱,運行庫會在哥哥位置上搜索該程序集,位置包括本地目錄和全局程序集緩存。LoadFrom()方法參數是完整的程序集路徑。code
相關源碼:https://files.cnblogs.com/files/pilgrim/MyReflection.rar對象
Console.WriteLine("*****************Reflection***********"); Assembly assembly = Assembly.Load("DB.MySql");//獲取當前路徑下的dll,不須要後綴 Module[] modules = assembly.GetModules();//獲取程序集中的全部模塊 Type[] types = assembly.GetTypes();//獲取程序中全部的類型 Attribute[] attributes= assembly.GetCustomAttributes().ToArray();//獲取程序中全部的自定義特性 Type dbHlperType = assembly.GetType("DB.MySql.MySqlHlper"); object oDBHlper = Activator.CreateInstance(dbHlperType);//建立對象(默認構造函數) DB.Interface.IDBHlper dBHlper = oDBHlper as DB.Interface.IDBHlper; dBHlper.Query();
爲使得程序更加靈活,能夠將上面的代碼進行修改優化。使用應用程序配置文件+工廠方法,在配置文件中添加代碼:blog
<add key="IDBHlper" value="DB.MySql,DB.MySql.MySqlHlper"/>。
添加類讀取相關數據:
public class SimpleFactory { /// <summary> /// 程序集名稱 /// </summary> public static string DllName { get; private set; } /// <summary> /// 程序集中的某個類型名稱 /// </summary> public static string TypeName { get; private set; } static SimpleFactory() { //從配置文件中讀取數據 string[] iDBHlperConfig = ConfigurationManager.AppSettings["IDBHlper"].Split(','); DllName = iDBHlperConfig[0].Trim(); TypeName = iDBHlperConfig[1].Trim(); } /// <summary> /// 建立實例 /// </summary> /// <returns></returns> public static DB.Interface.IDBHlper CreateInstance() { Assembly assembly = Assembly.Load(DllName);//加載程序集 Type type = assembly.GetType(TypeName);//獲取對應的類型 object dbHlper = Activator.CreateInstance(type);//建立實例 return dbHlper as DB.Interface.IDBHlper; } }
在代碼調用時使用:
//使用工廠方法建立實例 DB.Interface.IDBHlper dBHlper2 = SimpleFactory.CreateInstance(); dBHlper2.Query(); Console.WriteLine();
Assembly assembly = Assembly.Load("DB.SqlServer");//獲取當前路徑下的dll,不須要後綴 Type dbHlperType = assembly.GetType("DB.SqlServer.SqlServerHlper"); ConstructorInfo[] constructorInfos = dbHlperType.GetConstructors();//獲取全部的公共構造函數 //一個int類型參數的構造函數 object oDBHlper1 = Activator.CreateInstance(dbHlperType, new object[] { 520 }); //一個字符串類型參數的構造函數 object oDBHlper2 = Activator.CreateInstance(dbHlperType,new object[] { "一個字符串參數"}); //一個字符串類型和一個int類型參數的構造函數 object oDBHlper3 = Activator.CreateInstance(dbHlperType, new object[] { "一個字符串和一個int參數",520 }); //調用私有構造函數 object oDBHlper4 = Activator.CreateInstance(dbHlperType, true); Console.WriteLine(); //獲取泛型類型,其有三個泛型參數 Type genericType = assembly.GetType("DB.SqlServer.GenericType`3");//`3是佔位符,三個泛型參數 //將三個泛型參數類型的泛型建立爲: float int string類型的類 Type type = genericType.MakeGenericType(typeof(float), typeof(int), typeof(string)); object oGeneric = Activator.CreateInstance(type); Console.WriteLine(oGeneric.ToString());
Assembly assembly = Assembly.Load("DB.MySql");//獲取當前路徑下的dll,不須要後綴 Type type = assembly.GetType("DB.MySql.MySqlHlper"); object obj = Activator.CreateInstance(type);//建立對象(默認構造函數) foreach (var item in type.GetMethods()) { Console.WriteLine(item.Name); } MethodInfo method = type.GetMethod("Query", new Type[] { } );//若是重載了,必須傳入參數類型 method.Invoke(obj, null);//誰調用,調用傳入的參數 //method.Invoke(null, null);//該方法只適用於靜態函數 MethodInfo method1 = type.GetMethod("Query", new Type[] { typeof(int) }); method1.Invoke(obj, new object[] { 520});//誰調用,調用傳入的參數 MethodInfo method2 = type.GetMethod("Query",new Type[] { typeof(string)}); method2.Invoke(obj, new object[] { "字符串" });//誰調用,調用傳入的參數