反射整理学习一
前言:????
由于身邊也沒什么學習資料,也就一邊利用網絡一邊自己理解整理,慢慢地步入神秘的反射機制。
?
?
?
反射提供了封裝程序集、模塊和類型的對象(Type 類型)。可以使用反射動態創建類型的實例,將類型綁定到現有對象,或從現有對象獲取類型并調用其方法或訪問其字段和屬性。如果代碼中使用了屬性,可以利用反射對它們進行訪問。
-
簡而言之, 反射機制指的是程序在運行時能夠獲取自身的信息。例如一個對象能夠在運行時知道自己有哪些方法和屬性。
?
?
?
-
使用?Assembly?定義和加載程序集,加載在程序集清單中列出的模塊,以及從此程序集中查找類型并創建該類型的實例。
-
使用?Module?發現以下信息:包含模塊的程序集以及模塊中的類等。您還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
-
使用?ConstructorInfo?發現以下信息:構造函數的名稱、參數、訪問修飾符(如 public 或 private)和實現詳細信息(如 abstract 或 virtual)等。使用?Type?的?GetConstructors?或?GetConstructor?方法來調用特定的構造函數。
-
使用?MethodInfo?發現以下信息:方法的名稱、返回類型、參數、訪問修飾符(如 public 或 private)和實現詳細信息(如 abstract 或 virtual)等。使用?Type?的?GetMethods?或?GetMethod?方法來調用特定的方法。
-
使用?FieldInfo?發現以下信息:字段的名稱、訪問修飾符(如 public 或 private)和實現詳細信息(如 static)等;并獲取或設置字段值。
-
使用?EventInfo?發現以下信息:事件的名稱、事件處理程序數據類型、自定義屬性、聲明類型和反射類型等;并添加或移除事件處理程序。
-
使用?PropertyInfo?發現以下信息:屬性的名稱、數據類型、聲明類型、反射類型和只讀或可寫狀態等;并獲取或設置屬性值。
-
使用?ParameterInfo?發現以下信息:參數的名稱、數據類型、參數是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。
-
當您在一個應用程序域的僅反射上下文中工作時,請使用?CustomAttributeData?來了解有關自定義屬性的信息。使用?CustomAttributeData,您不必創建屬性的實例就可以檢查它們。
-
?
程序集,模塊,類型,成員之間的關系(這里我做一簡要說明)
程序集是.NET框架應用程序的構造塊,程序集構成部署,版本控制,重復使用,激活范圍控制和安全權限的基本單元。
直接說重點:程序集包含模塊,而模塊包含類型,類型有包含成員。
?
?
?
?
我們承接上面的內容,System.Reflection這個命名空間下定義了一系列的類,他們與System.Type類一起提供反射功能。看完這一句話你應該明白了,System.Reflection命名空間下的一系列的類和System命名空間下的Type類是一起提供了反射功能,缺一不可。于是我們實現反射功能,為什么會至少會引用以下兩個命名空間:
?
?
?
現在我們來看一下System.Reflection命名空間下的主要類的功能:(下面列舉幾個常用的)
Assembly 表示一個程序集,它是一個可重用、無版本沖突并且可自我描述的公共語言運行時應用程序構造塊。? Module ?在模塊上執行反射。 ConstructorInfo 發現類構造函數的特性并提供對構造函數元數據的訪問權。 MethodInfo 發現方法的特性并提供對方法元數據的訪問。 FieldInfo 發現字段特性并提供對字段元數據的訪問權。 PropertyInfo 發現屬性的特性并提供對屬性元數據的訪問。 CustomAttributeData 提供對加載到只反射上下文中的程序集、模塊、類型、成員和參數的自定義特性數據的訪問。 ?EventInfo ?發現事件的特性并提供對事件元數據的訪問權。 ?
System.Reflection.Emit?命名空間的類提供了一種特殊形式的反射,使您能夠在運行時生成類型。
反射也可用于創建稱作類型瀏覽器的應用程序,它使用戶能夠選擇類型,然后查看有關選定類型的信息。
?
System.Reflection?命名空間中的類最常用的方法都使用統一的模式。Module,Type和MemberInfo類的成員都具有如下基本形式:
- MyInstance[]FindXxx(filter,filterCriteria):查找并返回經過篩選的類型列表,或者在當前類型沒有實現任何匹配篩選器的類型的情況下返回空數組。
- MyInstance GetXxx(<parameters>):返回由<parameters>唯一指定的類型,如果不存在這樣的類型,成員將返回一個空引用。
- MyInstance[]GetXxxs():返回所有的公共類型,如果不存在公共類型,成員將返回空數組。
- MyInstance[]GetXxxs(<parameters>):返回由<parameters>指定的所有類型,如果不存在這樣的類型,成員將返回空數組
-
?
?Type類為System.Refection?實現反射功能的基礎,也是訪問程序集的元數據的主要方式。
對于Type類我們先熟悉一下它提供了那些屬性和方法,當然用法很簡單,我們看完它的內容就小小的測試一下:
具體的可以在MSDN自己看:http://msdn.microsoft.com/zh-cn/library/42892f65.aspx
泛型類型定義不可以從封閉構造的類型賦值。也就是說,不能將封閉構造類型MyGenericList<int>賦給MyGenericList<T>類型的變量。
下面是我的測試代碼:
TyepTest Code 1 using System;2 using System.Reflection;3 4 namespace TypeInfoTest5 {6 public class Program7 {8 static void Main(string[] args)9 { 10 GetTypeInfo(" TypeInfoTest.Program"); 11 Console.ReadKey(); 12 } 13 14 private static void GetTypeInfo(string className) 15 { 16 try 17 { 18 Type type = Type.GetType(className); 19 Console.WriteLine("類型名:" + type.Name); 20 Console.WriteLine("類的全名:" + type.FullName); 21 Console.WriteLine("命名空間名:" + type.Namespace); 22 Console.WriteLine("程序集名:" + type.Assembly); 23 Console.WriteLine("模塊名:" + type.Module); 24 Console.WriteLine("基類名" + type.BaseType); 25 Console.WriteLine("運行時映射類名:" + type.UnderlyingSystemType); 26 Console.WriteLine("是否是類:" + type.IsClass); 27 Console.WriteLine("是否是從COM類型庫導入的:"+type.IsImport);//是否應用了ComImportAttribute屬性 28 Console.WriteLine("是否是泛型類型:"+type.IsGenericType); 29 Console.WriteLine("是否是接口:" + type.IsInterface); 30 Console.WriteLine("是否是抽象類:" + type.IsAbstract); 31 Console.WriteLine("是否是數組類:" + type.IsArray); 32 Console.WriteLine("是否是值類型:" + type.IsValueType); 33 Console.WriteLine("是否是基本類型:" + type.IsPrimitive); 34 Console.WriteLine("是否是公共類型:"+type.IsPublic); 35 Console.WriteLine("關聯的屬性:"+type.Attributes); 36 Console.WriteLine("句柄:"+type.TypeHandle); 37 Console.WriteLine("===============MakeArrayType================="); 38 Type t = typeof(Program).MakeArrayType(); 39 Console.WriteLine("Program類型的數組: {0}", t); 40 t = typeof(Program).MakeArrayType(2); 41 Console.WriteLine("Program類型的數組: {0}", t); 42 try 43 { 44 t = typeof(Program).MakeArrayType(-1); 45 } 46 catch (Exception ex) 47 { 48 Console.WriteLine("{0}", ex); 49 } 50 Console.WriteLine("===============MakeArrayType================="); 51 Console.WriteLine("\n===============.GetMethods================="); 52 MethodInfo[] Minfos = typeof(Program).GetMethods(); 53 foreach (MethodInfo i in Minfos) 54 { 55 Console.WriteLine(i.Name); 56 } 57 Console.WriteLine("===============.GetMethods=================\n"); 58 #region "類的公共成員" 59 Console.WriteLine("類的公共成員:"); 60 foreach (MemberInfo info in type.GetMembers()) 61 { 62 Console.WriteLine("\t{0} :{1}", info.MemberType, info); 63 } 64 #endregion 65 #region "類的字段成員" 66 Console.WriteLine("\t類的字段成員:"); 67 if (type.GetFields().Length > 0) 68 { 69 foreach (FieldInfo field in type.GetFields()) 70 { 71 Console.WriteLine("\t{0} :{1}", field.MemberType, field); 72 } 73 } 74 else 75 { 76 Console.WriteLine("該類型不包含字段!"); 77 } 78 #endregion 79 } 80 catch (Exception ex) 81 { 82 83 Console.WriteLine(ex.Message); 84 } 85 } 86 } 87 }運行結果:
轉載于:https://www.cnblogs.com/zhangchenliang/archive/2012/04/26/2471249.html
總結
- 上一篇: 第九章 表单效验
- 下一篇: 为不同目录设置Forms身份验证