Assembly | 使用Assembly定義和加載程序集,加載在程序集清單中列出模塊,以及從此程序集中查找類型并創建該類型的實例。 |
Module | 通過它可以獲取包含模塊的程序集以及模塊中的類等,還可以獲取在模塊上定義的所有全局方法或其他特定的非全局方法。 |
MemberInfo | 這是一個基類,它定義了EventInfo、FieldInfo、MethodInfo、PRopertyInfo的多個公用行為。 |
Type | 是System命名空間下的一個類,一般用于裝載反射得到的類對象,通過Type可以得到一個類的內部信息,也可以通過它反射創建一個對象。 |
EventInfo | 通過它可以獲取事件的相關信息。如事件的名稱、事件處理程序數據類型、聲明類型等,還可以添加或移除事件處理程序。 |
FieldInfo | 可以通過它獲取字段的相關信息。如字段的名稱、訪問修飾符等,還可以獲取或設置字段值。 |
MethodInfo | 通過它可以獲取方法的相關信息。例如方法的名稱、返回類型、參數、訪問修飾符等。使用Type的GetMethods或GetMethod方法來調用特定的方法。 |
PropertyInfo | 通過它可以獲取屬性的相關信息。例如屬性的名稱、數據類型、聲明類型和只讀或可寫狀態等,還可以獲取或設置屬性值。 |
ConstructorInfo | 通過它可以了解構造函數的屬性及調用構造函數??梢杂蒚ype對象的GetConstructors或GetConstructor方法返回的。 |
ParameterInfo | 通過它可以了解參數相關信息。例如參數的名稱、數據類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。 |
Reflection,中文翻譯為反射,是.Net中獲取運行時類型信息的方式。
.Net的應用程序由幾個部分:程序集(Assembly)、模塊(Module)、類型 (class)組成,而反射提供一種編程的方式,讓程序員可以在程序運行期獲得這幾個組成部分的相關信息。
通過Assembly類對象的Load方法、LoadFrom方法和LoadFile方法可以獲取程序集的相關信息。
三者之間的區別:
LoadFrom和Load差不多,只是LoadFrom是多了先獲取其中的程序集版本,語言文化,公鑰標記等信息,把他們傳遞給 Load方法這一步。
LoadFrom不能用于加載標識相同但路徑不同的程序集。
LoadFile 方法用來來加載和檢查具有相同標識但位于不同路徑中的程序集.但不會加載程序的依賴項。
1、Assembly.LoadFile只載入相應的dll文件,比如Assembly.LoadFile("abc.dll"),則載入abc.dll,假如abc.dll中引用了def.dll的話,def.dll并不會被載入。
Assembly.LoadFrom則不一樣,它會載入dll文件及其引用的其他dll,比如上面的例子,def.dll也會被載入。
2、用Assembly.LoadFrom載入一個Assembly時,會先檢查前面是否已經載入過相同名字的Assembly,比如abc.dll有兩個版本(版本1在目錄1下,版本2放在目錄2下),程序一開始時載入了版本1,當使用Assembly.LoadFrom("2//abc.dll")載入版本2時,不能載入,而是返回版本1。
Assembly.LoadFile的話則不會做這樣的檢查,比如上面的例子換成Assembly.LoadFile的話,則能正確載入版本2。
1、用Object.GetType().Module來獲取。
2、用Assembly類對象的GetModules方法來獲取。
1、用typeof運算符獲取。
2、用靜態方法Type.GetType來獲取。
3、用Assembly類對象的GetType或者GetTypes方法來獲取。
1、用System.Reflection空間下的Assembly類對象的CreateInstance方法來創建對象。
2、用System.Activator類提供的靜態方法CreateInstance來創建對象。
通過Type類對象的GetMethod或者GetMethods方法獲取到類里面的方法,然后用MethodInfo對象的Invoke方法去執行。
通過Type類對象的GetField方法來獲取字段,用FieldInfo對象存儲獲取到的字段,可以通過FieldInfo對象的GetValue和SetValue方法讀取和設置字段。
通過Type類對象的GetPropertie或者GetProperties方法來獲取屬性,用PropertyInfo對象存儲獲取到的屬性,然后通過PropertyInfo對象的GetValue和SetValue方法讀取和設置屬性值。
1、創建個類庫工程,在這工程里面定義一個類。(我這里工程名為:Study__Reflection,類名為:StudyReflection)
1 namespace Study__Reflection 2 { 3 public class StudyReflection 4 { 5 /// <summary> 6 /// 學習 7 /// </summary> 8 /// <param name="name">姓名</param> 9 /// <returns>字符串</returns>10 public string Study(string name)11 {12 return name + "正在學習反射";13 }14 /// <summary>15 /// 無參構造函數16 /// </summary>17 public StudyReflection() { }18 19 /// <summary>20 /// 有參構造函數21 /// </summary>22 /// <param name="a"></param>23 /// <param name="b"></param>24 public StudyReflection(int a, int b)25 {26 SetValue(a, b);27 }28 29 #region 私有成員變量30 private int x;31 private int y;32 public string Status;33 #endregion34 35 #region 屬性36 public int X37 {38 get { return x; }39 set { x = value; }40 }41 42 public int Y43 {44 get { return y; }45 set { y = value; }46 }47 48 #endregion49 /// <summary>50 /// 計算x和y的和51 /// </summary>52 /// <returns>x+y</returns>53 public int sum()54 {55 return x + y;56 }57 58 /// <summary>59 /// 取2個數之間的商的整數60 /// </summary>61 /// <param name="z"></param>62 /// <param name="t"></param>63 /// <returns></returns>64 public int div(int z, int t)65 {66 return z/t;67 }68 69 /// <summary>70 /// 計算x和y的積71 /// </summary>72 /// <returns>x*y</returns>73 private int product()74 {75 return x * y;76 }77 /// <summary>78 /// 給x和y賦值79 /// </summary>80 /// <param name="a">整形a</param>81 /// <param name="b">整形b</param>82 public void SetValue(int a,int b)83 {84 x = a;85 y = b;86 }87 }88 }
把這工程指定好路徑編譯好。生成的dll文件就是準備用于學習反射相關知識的。
下面是反射的基本用法:
1 //獲取程序集 2 Assembly asem = Assembly.LoadFrom("../lib/Study_ Reflection.dll"); 3 //Assembly asem2 = Assembly.Load("Study_ Reflection, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 4 //Assembly asem3 = Assembly.LoadFile(@"D:/mythings/Study/lib/Study_ Reflection.dll"); //注意是全路徑 5 6 //用Object.GetType().Module來獲取。 7 Class1 cc = new Class1(); 8 Module m = cc.GetType().Module; 9 //用Assembly類對象的GetModules方法來獲取。10 if (asem == null)11 {12 asem = Assembly.LoadFrom("../lib/Study_ Reflection.dll");13 }14 Module[] ms = asem.GetModules();15 16 //通過Assembly.GetType獲取Type17 Type t = asem.GetType("Study__Reflection.StudyReflection");18 19 //通過Assembly.CreateInstance進行無參數實例化20 object awc = asem.CreateInstance("Study__Reflection.StudyReflection", true);21 //通過Activator.CreateInstance進行無參數實例化22 object aa = Activator.CreateInstance(asem.FullName, "Study__Reflection.StudyReflection").Unwrap();23 //通過Activator.CreateInstance方法傳入Type對象執行默認的無參數構造函數來創建實例24 object o = Activator.CreateInstance(t);25 //通過Assembly.CreateInstance進行有參數實例化26 object[] te = new object[2] { 100, 200 };27 object ayc = asem.CreateInstance("Study__Reflection.StudyReflection", true, BindingFlags.Default, null, te, null, null);28 29 //屬性30 PropertyInfo[] ps = t.GetProperties(); //通過Type.GetProperties獲取屬性31 PropertyInfo p = t.GetProperty("X"); //通過Type.GetPropertie來獲取指定名稱的屬性32 p.SetValue(o, 99); //給X屬性賦值33 p.GetValue(o); //讀取X屬性34 //獲取字段35 FieldInfo[] fs = t.GetFields(); //通過Type.GetFields獲取字段36 FieldInfo f = t.GetField("Status"); //通過Type.GetField來獲取指定名稱的字段37 f.SetValue(o, "奮發圖強"); //給Status字段賦值38 f.GetValue(o); //讀取Status字段39 //獲取方法40 MethodInfo[] methods = t.GetMethods();//通過Type.GetMethods獲取方法41 MethodInfo method_div = t.GetMethod("div"); //通過Type.GetMethod來獲取指定名稱的方法42 method_div.Invoke(o, new object[] { 2222, 333 });//調用有2個參數的div方法
新聞熱點
疑難解答