反射是.NET中的重要機制埋同,通過反射劳较,可以在運行時獲得程序或程序集中每一個類型(包括類驹止、結(jié)構(gòu)、委托观蜗、接口和枚舉等)的成員和成員的信息臊恋。有了反射,即可對每一個類型了如指掌墓捻。另外我還可以直接創(chuàng)建對象抖仅,即使這個對象的類型在編譯時還不知道。
反射的用途
1).使用Assembly定義和加載程序集砖第,加載在程序集清單中列出模塊撤卢,以及從此程序集中查找類型并創(chuàng)建該類型的實例。
2).使用Module了解包含模塊的程序集以及模塊中的類等梧兼,還可以獲取在模塊中定義的所有全局方法或其他特定的非全局方法放吩。
3).使用ConstructorInfo了解構(gòu)造函數(shù)的名稱、參數(shù)羽杰、訪問修飾符(如public或private)和實現(xiàn)詳細(xì)信息(如abstract或virtual)等屎慢。
4).使用MethodInfo了解方法的名稱瞭稼、返回類型忽洛、參數(shù)腻惠、訪問修飾符(如public和private)和實現(xiàn)詳細(xì)信息(如abstract或virtual)等。
5).使用FiedInfo了解字段的名稱欲虚、訪問修飾符(如public和private)和實現(xiàn)詳細(xì)信息(如static)等集灌,并獲取或設(shè)置字段值。
6).使用EventInfo了解事件的名稱复哆、事件處理程序數(shù)據(jù)類型欣喧、自定義屬性、聲明類型和反射類型等梯找,添加或移除事件處理程序唆阿。
7).使用PropertyInfo了解屬性的名稱、數(shù)據(jù)類型锈锤、聲明類型驯鳖、反射類型和只讀或可寫狀態(tài)等,獲取或設(shè)置屬性值久免。
8).?使用ParameterInfo了解參數(shù)的名稱浅辙、數(shù)據(jù)類型、是輸入?yún)?shù)還是輸出參數(shù)阎姥,以及參數(shù)在方法簽名中的位置等记舆。
反射用到得到命名空間:
System.Reflection? ? System.Type? ?System.Reflection.Assembly
反射用到的主要類:
System.Type類? --通過這個類可以訪問任何給定數(shù)據(jù)類型的信息。
System.Reflection.Assembly類 --它可以用于訪問給定程序集的信息呼巴,或者把這個程序集加載到程序中泽腮。
System.Type類:
? ? System.Type類對于反射起核心作用。但它是一個抽象的基類衣赶,Type有與每種數(shù)據(jù)類型對應(yīng)的派生類诊赊,我們使用這個派生類的對象的方法、字段屑埋、屬性來查找有關(guān)該類型的所有信息豪筝。
獲取給定類型的Type引用有3種常用方式:
? ? 使用C#?typeof運算符:
? ? ? ? ? ? ? ? ? ? Type t = typeof(string);
? ? 使用對象GetType()方法。
? ? ? ? ? ? ? ? ? ? string s = "grayworm";
? ? ? ? ? ? ? ? ? ? Type t = s.GetType();
? ? ?調(diào)用Type類的靜態(tài)方法GetType()摘能。
? ? ? ? ? ? ? ? ? ? Type t = Type.GetType("System.String");
Type類的屬性:
????????Name 數(shù)據(jù)類型名
??????? FullName 數(shù)據(jù)類型的完全限定名(包括命名空間名)
??????? Namespace 定義數(shù)據(jù)類型的命名空間名
??????? IsAbstract 指示該類型是否是抽象類型
??????? IsArray?? 指示該類型是否是數(shù)組
??????? IsClass?? 指示該類型是否是類
??????? IsEnum?? 指示該類型是否是枚舉
??????? IsInterface??? 指示該類型是否是接口
??????? IsPublic 指示該類型是否是公有的
??????? IsSealed 指示該類型是否是密封類
??????? IsValueType 指示該類型是否是值類型
?Type類的方法:? ? ??
?????GetConstructor(), GetConstructors():
????????返回ConstructorInfo類型续崖,用于取得該類的構(gòu)造函數(shù)的信息
??????? GetEvent(), GetEvents():返回EventInfo類型,用于取得該類的事件的信息
??????? GetField(), GetFields():返回FieldInfo類型团搞,用于取得該類的字段(成員變量)的信息
??????? GetInterface(), GetInterfaces():返回InterfaceInfo類型严望,用于取得該類實現(xiàn)的接口的信息
??????? GetMember(), GetMembers():返回MemberInfo類型,用于取得該類的所有成員的信息
??????? GetMethod(), GetMethods():返回MethodInfo類型逻恐,用于取得該類的方法的信息
??????? GetProperty(), GetProperties():返回PropertyInfo類型像吻,用于取得該類的屬性的信息
??? 可以調(diào)用這些成員峻黍,其方式是調(diào)用Type的InvokeMember()方法,或者調(diào)用MethodInfo, PropertyInfo和其他類的Invoke()方法
用構(gòu)造函數(shù)動態(tài)生成對象:
?? ??Type t = typeof(NewClassw);
????????Type[] pt = new Type[2];
??????? pt[0] = typeof(string);
??????? pt[1] = typeof(string);
??????? //根據(jù)參數(shù)類型獲取構(gòu)造函數(shù)?
????????ConstructorInfo ci = t.GetConstructor(pt);
??????? //構(gòu)造Object數(shù)組拨匆,作為構(gòu)造函數(shù)的輸入?yún)?shù)?
????????object[] obj = new object[2]{"grayworm","hi.baidu.com/grayworm"};???
??????? //調(diào)用構(gòu)造函數(shù)生成對象?
????????object o = ci.Invoke(obj);
??????? //調(diào)用生成的對象的方法測試是否對象生成成功?
??????? //((NewClassw)o).show();????
System.Reflection.Assembly類?
???? Assembly類可以獲得程序集的信息姆涩,也可以動態(tài)的加載程序集,以及在程序集中查找類型信息惭每,并創(chuàng)建該類型的實例骨饿。
??? 使用Assembly類可以降低程序集之間的耦合,有利于軟件結(jié)構(gòu)的合理化台腥。
????通過程序集名稱返回Assembly對象
????Assembly ass = Assembly.Load("ClassLibrary831");
????通過DLL文件名稱返回Assembly對象
????Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
????通過Assembly獲取程序集中類
????Type t = ass.GetType("ClassLibrary831.NewClass");?? //參數(shù)必須是類的全名
????通過Assembly獲取程序集中所有的類
????Type[] t = ass.GetTypes();