反射整理学习一
前言:????
由于身邊也沒什么學(xué)習(xí)資料,也就一邊利用網(wǎng)絡(luò)一邊自己理解整理,慢慢地步入神秘的反射機(jī)制。
?
?
?
反射提供了封裝程序集、模塊和類型的對象(Type 類型)。可以使用反射動態(tài)創(chuàng)建類型的實(shí)例,將類型綁定到現(xiàn)有對象,或從現(xiàn)有對象獲取類型并調(diào)用其方法或訪問其字段和屬性。如果代碼中使用了屬性,可以利用反射對它們進(jìn)行訪問。
-
簡而言之, 反射機(jī)制指的是程序在運(yùn)行時能夠獲取自身的信息。例如一個對象能夠在運(yùn)行時知道自己有哪些方法和屬性。
?
?
?
-
使用?Assembly?定義和加載程序集,加載在程序集清單中列出的模塊,以及從此程序集中查找類型并創(chuàng)建該類型的實(shí)例。
-
使用?Module?發(fā)現(xiàn)以下信息:包含模塊的程序集以及模塊中的類等。您還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。
-
使用?ConstructorInfo?發(fā)現(xiàn)以下信息:構(gòu)造函數(shù)的名稱、參數(shù)、訪問修飾符(如 public 或 private)和實(shí)現(xiàn)詳細(xì)信息(如 abstract 或 virtual)等。使用?Type?的?GetConstructors?或?GetConstructor?方法來調(diào)用特定的構(gòu)造函數(shù)。
-
使用?MethodInfo?發(fā)現(xiàn)以下信息:方法的名稱、返回類型、參數(shù)、訪問修飾符(如 public 或 private)和實(shí)現(xiàn)詳細(xì)信息(如 abstract 或 virtual)等。使用?Type?的?GetMethods?或?GetMethod?方法來調(diào)用特定的方法。
-
使用?FieldInfo?發(fā)現(xiàn)以下信息:字段的名稱、訪問修飾符(如 public 或 private)和實(shí)現(xiàn)詳細(xì)信息(如 static)等;并獲取或設(shè)置字段值。
-
使用?EventInfo?發(fā)現(xiàn)以下信息:事件的名稱、事件處理程序數(shù)據(jù)類型、自定義屬性、聲明類型和反射類型等;并添加或移除事件處理程序。
-
使用?PropertyInfo?發(fā)現(xiàn)以下信息:屬性的名稱、數(shù)據(jù)類型、聲明類型、反射類型和只讀或可寫狀態(tài)等;并獲取或設(shè)置屬性值。
-
使用?ParameterInfo?發(fā)現(xiàn)以下信息:參數(shù)的名稱、數(shù)據(jù)類型、參數(shù)是輸入?yún)?shù)還是輸出參數(shù),以及參數(shù)在方法簽名中的位置等。
-
當(dāng)您在一個應(yīng)用程序域的僅反射上下文中工作時,請使用?CustomAttributeData?來了解有關(guān)自定義屬性的信息。使用?CustomAttributeData,您不必創(chuàng)建屬性的實(shí)例就可以檢查它們。
-
?
程序集,模塊,類型,成員之間的關(guān)系(這里我做一簡要說明)
程序集是.NET框架應(yīng)用程序的構(gòu)造塊,程序集構(gòu)成部署,版本控制,重復(fù)使用,激活范圍控制和安全權(quán)限的基本單元。
直接說重點(diǎn):程序集包含模塊,而模塊包含類型,類型有包含成員。
?
?
?
?
我們承接上面的內(nèi)容,System.Reflection這個命名空間下定義了一系列的類,他們與System.Type類一起提供反射功能。看完這一句話你應(yīng)該明白了,System.Reflection命名空間下的一系列的類和System命名空間下的Type類是一起提供了反射功能,缺一不可。于是我們實(shí)現(xiàn)反射功能,為什么會至少會引用以下兩個命名空間:
?
?
?
現(xiàn)在我們來看一下System.Reflection命名空間下的主要類的功能:(下面列舉幾個常用的)
Assembly 表示一個程序集,它是一個可重用、無版本沖突并且可自我描述的公共語言運(yùn)行時應(yīng)用程序構(gòu)造塊。? Module ?在模塊上執(zhí)行反射。 ConstructorInfo 發(fā)現(xiàn)類構(gòu)造函數(shù)的特性并提供對構(gòu)造函數(shù)元數(shù)據(jù)的訪問權(quán)。 MethodInfo 發(fā)現(xiàn)方法的特性并提供對方法元數(shù)據(jù)的訪問。 FieldInfo 發(fā)現(xiàn)字段特性并提供對字段元數(shù)據(jù)的訪問權(quán)。 PropertyInfo 發(fā)現(xiàn)屬性的特性并提供對屬性元數(shù)據(jù)的訪問。 CustomAttributeData 提供對加載到只反射上下文中的程序集、模塊、類型、成員和參數(shù)的自定義特性數(shù)據(jù)的訪問。 ?EventInfo ?發(fā)現(xiàn)事件的特性并提供對事件元數(shù)據(jù)的訪問權(quán)。 ?
System.Reflection.Emit?命名空間的類提供了一種特殊形式的反射,使您能夠在運(yùn)行時生成類型。
反射也可用于創(chuàng)建稱作類型瀏覽器的應(yīng)用程序,它使用戶能夠選擇類型,然后查看有關(guān)選定類型的信息。
?
System.Reflection?命名空間中的類最常用的方法都使用統(tǒng)一的模式。Module,Type和MemberInfo類的成員都具有如下基本形式:
- MyInstance[]FindXxx(filter,filterCriteria):查找并返回經(jīng)過篩選的類型列表,或者在當(dāng)前類型沒有實(shí)現(xiàn)任何匹配篩選器的類型的情況下返回空數(shù)組。
- MyInstance GetXxx(<parameters>):返回由<parameters>唯一指定的類型,如果不存在這樣的類型,成員將返回一個空引用。
- MyInstance[]GetXxxs():返回所有的公共類型,如果不存在公共類型,成員將返回空數(shù)組。
- MyInstance[]GetXxxs(<parameters>):返回由<parameters>指定的所有類型,如果不存在這樣的類型,成員將返回空數(shù)組
-
?
?Type類為System.Refection?實(shí)現(xiàn)反射功能的基礎(chǔ),也是訪問程序集的元數(shù)據(jù)的主要方式。
對于Type類我們先熟悉一下它提供了那些屬性和方法,當(dāng)然用法很簡單,我們看完它的內(nèi)容就小小的測試一下:
具體的可以在MSDN自己看:http://msdn.microsoft.com/zh-cn/library/42892f65.aspx
泛型類型定義不可以從封閉構(gòu)造的類型賦值。也就是說,不能將封閉構(gòu)造類型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("運(yùn)行時映射類名:" + type.UnderlyingSystemType); 26 Console.WriteLine("是否是類:" + type.IsClass); 27 Console.WriteLine("是否是從COM類型庫導(dǎo)入的:"+type.IsImport);//是否應(yīng)用了ComImportAttribute屬性 28 Console.WriteLine("是否是泛型類型:"+type.IsGenericType); 29 Console.WriteLine("是否是接口:" + type.IsInterface); 30 Console.WriteLine("是否是抽象類:" + type.IsAbstract); 31 Console.WriteLine("是否是數(shù)組類:" + type.IsArray); 32 Console.WriteLine("是否是值類型:" + type.IsValueType); 33 Console.WriteLine("是否是基本類型:" + type.IsPrimitive); 34 Console.WriteLine("是否是公共類型:"+type.IsPublic); 35 Console.WriteLine("關(guān)聯(lián)的屬性:"+type.Attributes); 36 Console.WriteLine("句柄:"+type.TypeHandle); 37 Console.WriteLine("===============MakeArrayType================="); 38 Type t = typeof(Program).MakeArrayType(); 39 Console.WriteLine("Program類型的數(shù)組: {0}", t); 40 t = typeof(Program).MakeArrayType(2); 41 Console.WriteLine("Program類型的數(shù)組: {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 }運(yùn)行結(jié)果:
轉(zhuǎn)載于:https://www.cnblogs.com/zhangchenliang/archive/2012/04/26/2471249.html
總結(jié)
- 上一篇: 第九章 表单效验
- 下一篇: 为不同目录设置Forms身份验证