第一部分:程式集(System.Reflection.Assembly) 1.獲取Assembly對象 方法1:調用Assembly的以下4個靜態方法Get...()之一: GetAssembly(Type t) GetCallingAssembly() ——返回調用當前方法的方法所在的程式集 Ge ...
第一部分:程式集(System.Reflection.Assembly)
1.獲取Assembly對象
方法1:調用Assembly的以下4個靜態方法Get...()之一:
GetAssembly(Type t)
GetCallingAssembly() ——返回調用當前方法的方法所在的程式集
GetExecutingAssembly() ——返回當前執行代碼所在的程式集
GetEntryAssembly() ——返回當前AppDomain中包含Main方法的程式集
方法2:調用Assembly的以下3個靜態方法Load(...)之一:括弧中的...表示有若幹種重載
Load(...)
LoadWithPartialName(...)
LoadFrom(...)
方法3:通過Type對象的Assebmly屬性或者GetAssembly()方法,來獲取表示此類型的程式集Assembly對象——等價於前面的Assembly.GetAssembly(Type t)靜態方法
方法4:AppDomain.GetAssemblies() ——返回在AppDomain中載入的程式集。
2.獲取到Assembly對象後,可以使用其提供的屬性和方法,得到關於程式集的所有信息。見書上P19-20,這裡不再抄錄。
第二部分:類型(Type):包括 類/介面/數組/值類型/枚舉/指針
1.獲取Type對象
方法1:GetType()方法,有兩個:
Object類中的方法,所以所有類都會繼承這個方法,獲取自身的Type對象:
Type myType = myObj.GetType(); ——實例方法
同時,Type類存在一個靜態方法GetType,獲取沒有實例化的類的Type對象:
Type myType = Type.GetType("System.Double"); ——靜態方法,這裡System.Double以字元串形式傳遞,區分大小寫
註意:VB.NET提供GetType運算符,獲取對象的Type類型——C#下相應為typeof()方法:
Type myType = typeof(System.Double);
Dim myType as Type = GetType(System.Double); ——這裡,System.Double不需要加引號,作為類來傳遞。
方法2:GetInstances()方法,獲取對象實現或者繼承的所有介面類型,返回一個Type數組:
Type[] myInterfaces = myObj.GetInstances();
方法3:Reflection.Module.GetType()方法:
Type myType = myModule.GetType("ClassName");
一個Module中可能有多個Class,獲取模塊中所有類型:Module.GetTypes();
查找Module中某一Class類型:Module.FindTypes();
2.獲取到Type對象後,就可以訪問類成員了,見第三部分。
第三部分:類成員
Type.GetXXX()獲取相應的XXX,XXX指的是Method或Methods,Members,Propertiy等等。
1.MemberInfo
該類是一個抽象基類,成員類型都要從此派生。它提供了一些公共的屬性:Name(成員名稱);MemberType(成員類型)等等
通過Type的GetMembers()方法,配合BindingFlags枚舉,可以檢索成員:
myType.GetMembers(BindingFlags.Static | BindingFlags.Public);
或者
myType.GetMembers(BindingFlags.Instance | BindingFlags.NonPublic);
註意,BindingFlags.Instance與BindingFlags.Static不共存, BindingFlags.Public與BindingFlags.NonPublic不共存,否則,不會返回任何值——倒不是編譯期/運行期報錯。
所有的GetXXX()都可以這麼用:GetFields, GetMethods....
2.FieldInfo
該類有兩個方法很有用:GetValue()和SetValue():用於檢索/修改欄位值
3.PropertyInfo
該類也有GetValue()和SetValue()方法。還有CanRead和CanWrite屬性
4.MethodBase
這是一個抽象類,是MethodInfo和ConstructorInfo的基類,聲明瞭方法和構造函數的一些公共屬性和方法。
5.MethodInfo
多了一個ReturnType屬性
6.ConstructorInfo
當類中沒有顯示定義構造函數時,反射得到的元數據是預設構造函數。
7.EventInfo
這個類的屬性有IsMulticase——是否委托鏈;EventHandlerType——相應委托的Type
方法有成對的GetAddMethod/GetRemoveMethod,以及GetRaiseMethod——返回激活事件時要調用的方法
8.ParemeterInfo
直接派生於System.Object
通過在MethodInfo對象或者ConstructorInfo對象上調用GetParameters()方法獲取,不需要任何參數,返回一個ParemeterInfo數組。
利用反射進行動態載入和調用.
Assembly ass=Assembly.LoadFrom(DllPath); //利用dll的路徑載入
載入dll後,需要使用dll中某類.
Type type=ass.GetType(“TypeName”);//利用類型的命名空間和名稱獲得類型
需要實例化類型,才可以使用,參數可以人為的指定,也可以無參數,靜態實例可以省略
Object obj = Activator.CreateInstance(type,params[]);//利用指定的參數實例話類型
調用類型中的某個方法:
需要首先得到此方法
MethodInfo mi=type.GetMethod(“MehtodName”);//通過方法名稱獲得方法
然後對方法進行調用,多態性利用參數進行控制
mi.Invoke(obj,params[]);//根據參數直線方法,返回值就是原方法的返回值